groovy 无法将类为“java.lang.Class”的对象“类centaur.demo.Profile”强制转换为类“centaur.demo.Profile”

rvpgvaaj  于 2022-11-28  发布在  Java
关注(0)|答案(2)|浏览(143)

请帮我解决这个问题。谢谢!
我正在使用Java 1.8处理Grails-5.2.4项目。类加载器未按预期工作。

我正在获取以下代码段的类转换异常。

def index() {
    Profile profile = getClass().classLoader.loadClass("centaur.demo.Profile") as Profile
}

以下是例外详细信息:

Caused by: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'class centaur.demo.Profile' with class 'java.lang.Class' to class 'centaur.demo.Profile'
    at org.grails.web.converters.ConverterUtil.invokeOriginalAsTypeMethod(ConverterUtil.java:147)
    at org.grails.web.converters.ConvertersExtension.asType(ConvertersExtension.groovy:56)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at centaur.demo.IndexController.index(IndexController.groovy:10)
    ... 13 common frames omitted

预期行为:
下面的行应该返回类Profile的对象。

getClass().classLoader.loadClass("centaur.demo.Profile")

这在Grails 3.3.9中运行良好。

icomxhvb

icomxhvb1#

该行:

getClass().classLoader.loadClass("centaur.demo.Profile")

应该会传回Class对象。
查看文档:https://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html#loadClass-java.lang.String-
因此,您可以将结果分配给Class:

Class c = getClass().classLoader.loadClass("centaur.demo.Profile")

您可以示例化类:

def profile = getClass().classLoader.loadClass("centaur.demo.Profile").newInstance()

但以下代码可能会失败:

centaur.demo.Profile profile = getClass().classLoader.loadClass("centaur.demo.Profile").newInstance()

当用于声明的类加载器与getClass().classLoader返回的类加载器不同时

voase2hg

voase2hg2#

顾名思义,ClassLoader#loadClass返回java.lang.Class的一个示例。您必须示例化该类,以使用new Profile(...)或通过在loadClass的结果上调用Class#newInstance来获取其引用类型的对象(前提是您的Profile类具有可访问的默认构造函数)

相关问题