请帮我解决这个问题。谢谢!
我正在使用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中运行良好。
2条答案
按热度按时间icomxhvb1#
该行:
应该会传回
Class
对象。查看文档:https://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html#loadClass-java.lang.String-
因此,您可以将结果分配给Class:
您可以示例化类:
但以下代码可能会失败:
当用于声明的类加载器与
getClass().classLoader
返回的类加载器不同时voase2hg2#
顾名思义,
ClassLoader#loadClass
返回java.lang.Class
的一个示例。您必须示例化该类,以使用new Profile(...)
或通过在loadClass
的结果上调用Class#newInstance
来获取其引用类型的对象(前提是您的Profile类具有可访问的默认构造函数)