我有一个包含类A
的简单jar文件:
public class A {}
然后我在运行时加载它:
var classLoader = new URLClassLoader(Array(my_jar_file.toURI.toURL))
var clazz = classLoader.loadClass("A")
没关系,它可以加载类A
。这个命令也没问题:
clazz.newInstance
但是当我把它投到A
时:
clazz.newInstance.asInstanceOf[A]
我收到了这个错误:
java.lang.ClassCastException: A cannot be cast to A
你能帮我吗?
答案 0 :(得分:5)
您的代码暗示您在一个classLoader上下文中有“A”可用,您在其中调用clazz.newInstance.asInstanceOf [A],它是您获取clazz对象的单独上下文。 问题是在两个不同的classLoader上下文中有两个不同的类“A”实例。从一个版本的“A”类创建的对象不能转换为另一个版本的实例版本在不同的classLoader上下文中。
答案 1 :(得分:4)
我遇到了一个非常类似的问题,因为在将动态加载的对象转换为由它实现的接口时,我观察到ClassCastException
。
感谢Neil的回答,我能够确定ClassCastException
是由于具有不同的类加载器上下文引起的。
要解决此问题,我使用了URLClassLoader(URL[] urls, ClassLoader parent)
构造函数而不是URLClassLoader(URL[] urls)
构造函数。