我有一个编译的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有关,但不相同。
答案 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
}