2013-04-03 57 views
0

基於this question我創建了一個具有動態屬性的Groovy類。Groovy動態對象 - 如何正確重置屬性?

class MyDynamic { 
    def propertyMissing(String name, value) { 
    this.metaClass."$name" = value 
    value 
    } 
} 

到目前爲止都好,現在我可以設置與成功的一些不存在的財產

MyDynamic dyna = new MyDynamic() 
dyna.someProp = new Date() 

當我與財產同名的另一個實例我的問題開始,但與其他類型

MyDynamic dyna2 = new MyDynamic() 
dyna2.someProp = "0" //GroovyCastException: Cannot cast object '0' with class 'java.lang.String' to class 'java.util.Date' 

其實我需要這個,因爲我創建的對象與查詢的結果不知道表和列。我用ResultSetMetaData獲得列的名稱,並將該屬性添加到動態對象的實例。稍後我將使用這個對象來導出所有的屬性和值。在不同的表中,我有相同的列名稱,但具有不同的類型。

所以我的問題是:當我完成與不與其他實例衝突的實例時,如何重置此metaClass?

+0

這片段是不是工作 – Will 2013-04-03 22:00:51

+0

對不起,類寫着「類」 – 2013-04-03 22:02:06

+0

我固定的,但它仍然無法正常工作。你使用什麼版本? – Will 2013-04-03 22:02:53

回答

2

爲什麼不Expando,地圖或一個簡單的容器:

class Dynamic { 
    def properties = [:] 
    void setProperty(String name, value) { 
    properties[name] = value 
    } 

    def getProperty(String property) { properties[property] } 
} 

d = new Dynamic() 

d.name = "yeah" 
assert d.name.class == String 

d.name = new Date() 
assert d.name.class == Date 
+0

該死!我不知道Expando。謝謝! – 2013-04-03 22:12:05

+1

不客氣。另外,法律vernmconterrâneo:-) – Will 2013-04-04 10:06:11