Scala - 动态类加载 - 类A不能转换为A类

时间:2012-01-15 08:18:20

标签: class scala dynamic classloader loading

我有一个包含类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

你能帮我吗?

2 个答案:

答案 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)构造函数。