为什么';t Class.forName在grails域类上的工作

为什么';t Class.forName在grails域类上的工作,grails,reflection,groovy,Grails,Reflection,Groovy,我知道使用Class.forName加载grails域类是行不通的,但我不知道为什么会这样。我猜有一些圣杯魔法正在发生,但了解它是什么会很好 我最终使用了 GrailsDomainClass dc = grailsApplication.getDomainClass('mypack.myclass' ) def newDomainObject = dc.clazz.newInstance() 但是我不确定为什么仅仅做Class.forName('mypack.myclass')是不起作用的。G

我知道使用
Class.forName
加载grails域类是行不通的,但我不知道为什么会这样。我猜有一些圣杯魔法正在发生,但了解它是什么会很好

我最终使用了

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

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

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

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

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

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

自定义类加载器部分是有意义的,但是使用3 arg forName似乎不起作用。newInstance正在返回null。我在BootStrap.groovy中运行它,如果这有什么不同的话。
newInstance()
不能返回null,它调用构造函数。它要么成功,要么抛出异常。Grails添加的默认
toString()
将打印一个空id,因为它是一个新的非持久性实例-这就是您看到的吗?啊,是的,这就是混淆。我想知道newInstance如何返回null。我想可能是引擎盖下有个例外或者什么东西被吞下了。感谢您的帮助。@BurtBeckwith我们也面临同样的问题,但在我们的案例中,我们使用的是第三方库,它需要CustomClassName并在内部使用Class.forName()。我们想在这个库中使用我们的自定义类,有没有办法在grails上的groovy中解决这个问题?这不起作用,newDomainObject是[]而不是myclass实例,我仍然被卡住了,我不知道如何在grails应用程序中用反射实例化一个类自定义类加载器部分有意义,但是使用3 arg forName似乎不起作用。newInstance正在返回null。我在BootStrap.groovy中运行它,如果这有什么不同的话。
newInstance()
不能返回null,它调用构造函数。它要么成功,要么抛出异常。Grails添加的默认
toString()
将打印一个空id,因为它是一个新的非持久性实例-这就是您看到的吗?啊,是的,这就是混淆。我想知道newInstance如何返回null。我想可能是引擎盖下有个例外或者什么东西被吞下了。感谢您的帮助。@BurtBeckwith我们也面临同样的问题,但在我们的案例中,我们使用的是第三方库,它需要CustomClassName并在内部使用Class.forName()。我们想在这个库中使用我们的自定义类,有没有办法在grails上的groovy中解决这个问题?这不起作用,newDomainObject是[]而不是myclass实例,我仍然被卡住了,我不知道如何在grails应用程序中用反射实例化一个类