Class Scala-动态类加载-类A不能强制转换为类A
我有一个简单的jar文件,其中包含classClass Scala-动态类加载-类A不能强制转换为类A,class,scala,dynamic,classloader,loading,Class,Scala,Dynamic,Classloader,Loading,我有一个简单的jar文件,其中包含classa: public class A {} clazz.newInstance.asInstanceOf[A] 然后我在运行时加载它: var classLoader = new URLClassLoader(Array(my_jar_file.toURI.toURL)) var clazz = classLoader.loadClass("A") 它可以加载类A。此命令也可以: clazz.newInstance 但是当我把它投射到A: pub
a
:
public class A {}
clazz.newInstance.asInstanceOf[A]
然后我在运行时加载它:
var classLoader = new URLClassLoader(Array(my_jar_file.toURI.toURL))
var clazz = classLoader.loadClass("A")
它可以加载类A
。此命令也可以:
clazz.newInstance
但是当我把它投射到A
:
public class A {}
clazz.newInstance.asInstanceOf[A]
我得到了这个错误:
java.lang.ClassCastException: A cannot be cast to A
您能帮助我吗?您的代码意味着您在一个类加载器上下文中可以使用“A”,在该上下文中,您正在调用clazz.newInstance.asInstanceOf[A],它是一个独立于您获取clazz对象的上下文问题是在两个不同的类加载器上下文中有两个不同的类“A”实例。从一个版本的类“A”创建的对象不能在不同的类加载器上下文中转换为另一个版本的实例。我遇到了一个非常类似的问题,在这方面,我观察到一个
ClassCastException
在将动态加载的对象强制转换到它所实现的接口时。感谢Neil的回答,我能够确定
ClassCastException
是由不同的类装入器上下文引起的
为了解决这个问题,我使用了
URLClassLoader(URL[]URL,ClassLoader parent)
构造器,而不是URLClassLoader(URL[]URL)
构造器。使用[A]实例的代码,您想实现什么。谢谢。但是如果我用Java来做,那就好了。你能修好我的代码让我加载一个类并使用它吗?对不起。实际上,在Java中,我有一个接口I
A
是从I
实现的。当我从jar加载A
时,我检查它是否是I
的实例,然后转换到I
并使用。没关系。@HiBlack-在Scala中,trait没有方法实现或VAL/vars,直接编译到java接口。也许你可以让你的“A”扩展一些特质“I”,然后再做演员?谢谢尼尔,正如你所说,我已经对trait
有问题了,之后我发布了这个问题:-(()@Rogach:对不起,我是说你,我的打字错误。