Например, у меня есть требование, когда я использую SuperCSV для чтения файла csv и сопоставления с объектом.
У SuperCSV есть требование, согласно которому, если в заголовке указано имя поля «firstName», он должен иметь метод setFirstName() в классе, иначе он выдает исключение.
Теперь, если я использую компоненты Groovy, мне не нужно объявлять все эти методы, просто объявив, что переменные должны работать для 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 с небольшими изменениями в синтаксисе.