gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:35:04 26 4
gpt4 key购买 nike

我有一个已编译的 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 如何编译域对象有关,但我不确定这里发生了什么。

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

最佳答案

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

您是在查看从共享 .groovy 类在 Groovy 项目中编译的类,还是在 jar 中编译的类?
instanceof由于 Groovy 的评估顺序,这很棘手;尝试添加括号:

println (newDomainObject instanceof GroovyObject)

如果仍然打印错误,请尝试递归转储所有已实现的接口(interface):
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
}

关于grails - 域对象上的 Class.forName newInstance 不是来自 grails 外部的 GroovyObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12754932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com