0

我有一个已编译的 grails 项目,并且从一个单独的 groovy 项目中,我反射性地加载了一个域类,如下所示

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

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

println newDomainObject instanceof GroovyObject // false

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

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

请注意,这与为什么 Class.forName 不能在 grails 域类上工作有关,但不一样。

4

1 回答 1

1

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

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

instanceof由于 Groovy 的评估顺序,这很棘手;尝试添加括号:

println (newDomainObject instanceof GroovyObject)

如果仍然打印错误,请尝试递归转储所有已实现的接口:

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