【问题标题】:Why doesn't Class.forName work on grails domain classes为什么 Class.forName 不适用于 grails 域类
【发布时间】:2012-10-05 16:02:25
【问题描述】:

我知道使用Class.forName 加载grails 域类不起作用,但我不确定为什么会这样。我猜有某种 grails 魔法正在发生,但很高兴了解它是什么。

我最终使用了

GrailsDomainClass dc = grailsApplication.getDomainClass('mypack.myclass' )
def newDomainObject = dc.clazz.newInstance()

但我不确定为什么只做Class.forName('mypack.myclass') 不起作用。

【问题讨论】:

    标签: grails reflection groovy


    【解决方案1】:

    Grails 使用自定义类加载器,因此您需要将 3-arg 变体与 Grails 使用并注册为上下文类加载器的类加载器一起使用:

    Class clazz = Class.forName('mypack.myclass', true, Thread.currentThread().contextClassLoader)
    def newDomainObject = clazz.newInstance()
    

    【讨论】:

    • 自定义类加载器部分很有意义,但使用 3 arg forName 似乎不起作用。 newInstance 返回空值。如果有什么不同,我会在 BootStrap.groovy 中运行它。
    • newInstance() 不能返回 null,它调用了构造函数。它要么成功,要么抛出异常。 Grails 添加的默认 toString() 将打印一个空 id,因为它是一个新的非持久实例 - 这就是您所看到的吗?
    • 啊,是的,这就是混乱。我想知道 newInstance 如何返回 null。我想也许引擎盖下有一个例外或被吞下的东西。感谢您的帮助。
    • @BurtBeckwith 我们也面临同样的问题,但在我们的例子中,我们使用的是需要 CustomClassName 并在内部使用 Class.forName() 的 3rd 方库。我们想在这个库中使用我们的自定义类,有没有办法在 grails 上的 groovy 中解决这个问题?
    • 这不起作用,newDomainObject 是 [] 而不是 myclass 实例,我仍然卡住了,我不知道如何在 grails 应用程序中使用反射实例化一个类
    猜你喜欢
    • 2011-11-21
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2020-03-09
    • 2015-04-23
    • 2013-01-25
    相关资源
    最近更新 更多