我有一個要求,例如我使用SuperCSV來讀取csv文件並映射到對象。用Groovy動態創建方法帶參數
SuperCSV有一個要求,如果頭部指定一個字段名稱「firstName」,它需要在類中有setFirstName()方法,否則會引發異常。
現在,如果我使用Groovy bean,那麼我不需要聲明所有這些方法,只需聲明變量應該可以工作於SuperCSV。
但我正在尋找一個更動態的解決方案,我們甚至不需要聲明這些變量。
例如,只需要創建一個對象,並使用groovy的動態方法創建功能SuperCSV就能找到setters。
我看着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對象語法
如果我們在三重引號中創建字段,我們甚至不需要這樣做。如果你使用簡單的Groovy bean,那麼也可以通過聲明變量來自動獲取setter和getter。所以簡而言之,我正在尋找一個解決方案,我們甚至不必宣佈這些變量 –
@sachinjain,我可以誤解你。我試着說,你可以創建這個類的聲明,在飛行中使用你的方案。字段不是通過手動列出的,您可以自動生成。我編輯了答案,試圖澄清。 – Seagull
嘿Seaagull感謝它像一個魔術一樣工作了一點,因爲我是新的groovy,但終於得到它,如果有人正在尋找類似的東西我已經更新了我的原始帖子與代碼片段 –