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());