0

基于这个问题,我创建了一个具有动态属性的 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并将属性添加到动态对象的实例中。稍后我将使用这个对象来导出所有的属性和值。在不同的表中,我有相同的列名,但类型不同。

所以我的问题是:当我完成实例以不与其他实例冲突时,如何重置此元类?

4

1 回答 1

2

为什么不使用Expando、 Map 或简单容器:

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
于 2013-04-03T22:05:48.650 回答