Java 从单独的jar调用.asSubclass时引发ClassCastException
我有一个程序,通过它我有以下三个课程。前两个在Java 从单独的jar调用.asSubclass时引发ClassCastException,java,reflection,jar,runtime-error,dynamic-cast,Java,Reflection,Jar,Runtime Error,Dynamic Cast,我有一个程序,通过它我有以下三个课程。前两个在jar1.jar中: Main(使用找到的jar加载技巧): 第二个类位于jar2.jar,B: package prob2; import prob1.A; public class B implements A { @Override public void someMethod() { System.out.println("Hello, world!"); } } 如您所见,类B显然实现了接口
jar1.jar中:
Main
(使用找到的jar加载技巧):
第二个类位于jar2.jar
,B
:
package prob2;
import prob1.A;
public class B implements A {
@Override
public void someMethod() {
System.out.println("Hello, world!");
}
}
如您所见,类B
显然实现了接口A
。但是,当加载类B
,然后尝试对其调用asSubclass
时,失败,出现以下异常:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.ClassCastException: class prob2.B
at java.lang.Class.asSubclass(Class.java:3404)
at prob1.Main.main(Main.java:20)
... 5 more
请注意,在Eclipse中运行时,这不会失败
我做错了什么?我怎样才能解决这个问题呢?好吧,用我学到的知识找到了答案;在类Main
中,替换:
URLClassLoader cl = URLClassLoader.newInstance(urls);
与:
解决了这个问题P好的,用给我的知识找到了答案;在类
Main
中,替换:
URLClassLoader cl = URLClassLoader.newInstance(urls);
与:
解决了这个问题P请创建一个链接。@Tom现在可以了吗?:这个例子会导致同样的问题吗?因为它对我很管用。jar版本和一个更小的版本,带有classes.add(B.class)代码>而不是loadJar()
这意味着您的类A
在不同的类加载器上加载了两次;当它加载B
时,它从不同的类加载器获取类A
,而不是加载您的类Main
。可能是因为您还向jar2.jar或其他文件添加了A
reasons@Tom使用B.class
意味着该类打包在同一个jar中,而不动态加载,否?请创建一个。@Tom现在可以了吗?:这个例子会导致同样的问题吗?因为它对我很管用。jar版本和一个更小的版本,带有classes.add(B.class)代码>而不是loadJar()
这意味着您的类A
在不同的类加载器上加载了两次;当它加载B
时,它从不同的类加载器获取类A
,而不是加载您的类Main
。可能是因为您还向jar2.jar或其他文件添加了A
reasons@Tom使用B.class
意味着类被打包在同一个jar中,而不动态加载,不是吗?
URLClassLoader cl = URLClassLoader.newInstance(urls);
URLClassLoader cl = URLClassLoader.newInstance(urls, Main.class.getClassLoader());