首页 文章

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

提问于
浏览
0

基于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 回答

  • 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
    

相关问题