域对象上的Class.forName newInstance不是来自grails外部的GroovyObject

时间:2012-10-05 22:37:59

标签: grails reflection groovy domain-object

我有一个编译的grails项目,从一个单独的groovy项目,我反思地加载一个域类如下

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

从grails的outisde(在我单独的groovy项目中)运行时,该对象不会被识别为GroovyObject。

println newDomainObject instanceof GroovyObject // false

因为我是从grails之外运行的,所以我认为groovy会像任何其他类一样处理域类(并且从查看类文件,它确实实现了GroovyObject)。

我最好的猜测是它与grails如何编译域对象有关,但我不确定这里发生了什么。

请注意,这与Why doesn't Class.forName work on grails domain classes有关,但不相同。

1 个答案:

答案 0 :(得分:1)

这似乎是不可能的 - 就像javac更改没有显式扩展基类以扩展java.lang.Object的类一样,groovyc会更改所有Groovy类以实现groovy.lang.GroovyObject

您是在从共享的.groovy类或jar中的已编译类中查看Groovy项目中编译的类吗?

由于Groovy的评估顺序,

instanceof很棘手;尝试添加parens:

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
}