基于this question,我创建了一个具有动态属性的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 :(得分: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