例如,我有一个要求,我使用 SuperCSV 读取 csv 文件并映射到对象。
SuperCSV 有一个要求,如果标头指定字段名称“firstName”,则它需要在类中具有 setFirstName() 方法,否则它会引发异常。
现在,如果我使用 Groovy bean,那么我不需要声明所有这些方法,只需声明变量应该适用于 SuperCSV。
但我一直在寻找一个更动态的解决方案,我们甚至不必声明这些变量。
例如,只需动态创建一个对象,并使用 groovy 的动态方法创建功能 SuperCSV 将能够找到设置器。
我查看了各种选项,例如 Expando、ExpandoMetaClass,但这些并没有达到我的目的。
任何答案将不胜感激。
这是对我有用的代码片段,可以真正有助于减少大量代码和不必要的逻辑:
static def testBeanReader()
{
ICsvBeanReader beanReader = null;
try
{
beanReader = new CsvBeanReader(new FileReader("src/test.csv"),
CsvPreference.STANDARD_PREFERENCE);
}
catch(Exception e)
{
}
final String[] header = VirtualObject.getHeaders();
final CellProcessor[] processors = VirtualObject.getProcessors();
//Class c1 = createNewClass()
//String s = createClass()
def list = ["name", "age"]
def c = (new GroovyShell().evaluate(createClass(list)) as Class)
//println(c.methods.grep {it.name.startsWith("get")})
GroovyObject groovyObject = (GroovyObject)(beanReader.read(c, header, processors))
Object[] args = {};
println(groovyObject.getProperty("name"))
}
static def createClass(def list)
{
String classDeclaration = "\nclass Test {\n"
list.each
{
classDeclaration+="def $it\n"
}
classDeclaration+= """
}
return Test.class
"""
return classDeclaration
}
这适用于 supercsv,但可用于语法几乎没有变化的通用 java 对象