>我有一个编译的 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
}