Groovy动态对象 - 如何正确重置属性?

时间:2013-04-03 21:49:36

标签: grails dynamic groovy metaprogramming metaclass

基于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?

1 个答案:

答案 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