0

コンパイル済みの grails プロジェクトがあり、別の groovy プロジェクトから、次のようにドメイン クラスを反射的にロードします。

Class clazz = Class.forName('mypack.myclass', true, Thread.currentThread().contextClassLoader)
def newDomainObject = clazz.newInstance()

(私の別の groovy プロジェクトで) grails の外から実行すると、オブジェクトは GroovyObject として認識されません。

println newDomainObject instanceof GroovyObject // false

私は grails の外から実行しているので、groovy はドメイン クラスを他のクラスと同じように扱うと思います (クラス ファイルを見ると、GroovyObject が実装されています)。

私の推測では、これは grails がドメイン オブジェクトをコンパイルする方法と関係があると思われますが、ここで何が起こっているのかはわかりません。

これはWhy does Class.forName work on grails domain classesに関連していますが、同じではないことに注意してください。

4

1 に答える 1

1

これは不可能に思えます - javac が基本クラスを明示的に拡張しないクラスを extendsjava.lang.Objectに変更するように、groovyc はすべての Groovy クラスを implement に変更しますgroovy.lang.GroovyObject

Groovy プロジェクトで共有 .groovy クラスからコンパイルされたクラス、または jar 内のコンパイル済みクラスを見ていますか?

instanceofただし、Groovy の評価順序が原因で注意が必要です。括弧を追加してみてください:

println (newDomainObject instanceof GroovyObject)

それでも false が出力される場合は、実装されているすべてのインターフェースを再帰的にダンプしてみてください。

while (clazz != Object) {
   def interfaces = clazz.interfaces
   if (interfaces) {
      clazz.interfaces.each { println "$clazz.name implements $it.name" }
   }
   else {
      println "$clazz.name doesn't directly implement any interfaces"
   }
   clazz = clazz.superclass
}
于 2012-10-05T23:11:05.807 に答える