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 に答える