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



>我有一个编译的 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 域类有关,但并不相同。

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

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

由于Groovy的评估顺序,instanceof很棘手;尝试添加参数:

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
}

相关内容

  • 没有找到相关文章

最新更新