【问题标题】:Class.forName newInstance on domain object not a GroovyObject from outside of grails域对象上的 Class.forName newInstance 不是来自 grails 外部的 GroovyObject
【发布时间】:2012-09-27 02:56:01
【问题描述】:

我有一个已编译的 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有关,但不一样。

【问题讨论】:

    标签: grails reflection groovy domain-object


    【解决方案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
    }
    

    【讨论】:

    • 伯特,我也觉得不可能。尽管我正在使用来自另一个项目的共享 .groovy 文件,但要回答您的问题。我想将其称为日食主义,其中一些东西在我的开发环境中被搞砸了。我不知道是否确实如此,但突然之间它似乎起作用了。
    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 2011-06-06
    • 2011-01-06
    • 2013-02-08
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多