Java 动态类加载在运行时失败
我有以下java代码片段:Java 动态类加载在运行时失败,java,exception,dynamic,classloader,Java,Exception,Dynamic,Classloader,我有以下java代码片段: final Class<?> junitCoreClass = AccessController.doPrivileged( new PrivilegedAction<URLClassLoader>() { @Override public URLClassLoader run() { return new URLClassLoader(new URL[] { junitJarUrl });
final Class<?> junitCoreClass = AccessController.doPrivileged(
new PrivilegedAction<URLClassLoader>() {
@Override
public URLClassLoader run() {
return new URLClassLoader(new URL[] { junitJarUrl });
}
}).loadClass("org.junit.runner.JUnitCore");
System.out.println(junitCoreClass.getName());
final JUnitCore junitCore = (JUnitCore) junitCoreClass.newInstance();
您不需要执行
.loadClass(“org.junit.runner.JUnitCore”,**true**)代码>或在创建新实例之前调用类对象上的resolveClass()。问题在于,主类是由类路径上没有JUnit的系统类加载器(包含-classpath的加载器)加载的。然后,创建一个单独的类装入器,该类装入器在类路径上只有JUnit。当主类尝试强制转换到JUnitCore时,系统类加载器被要求加载它不包含的JUnitCore,因此发生NoClassDefFoundError
如果不使用反射,就没有一种方便的方法来完成您想要做的事情。您需要(1)创建一个直接访问JUnitCore的单独类,(2)在URLClassLoader(目录或JAR)上包含该类的路径,(3)使用反射加载该类,以及(4)使用反射调用该类上的方法。我不知道您在说什么,因为Java 6在ClassLoader.loadClass()和Class.resolveClass()方法上都没有第二个参数。ClassLoader.loadClass确实有第二个布尔参数,但该方法不是公共的。ClassLoader.resolveClass已存在。这就是说,两者都与这个问题无关,所以我同意否决票。请给我们看一下例外情况的完整stacktrace。我担心的是:-/。谢谢你精心设计的答案。
java.lang.NoClassDefFoundError: org/junit/runner/JUnitCore
at [last line of example)
[lines from my app]
Caused by: java.lang.ClassNotFoundException: org.junit.runner.JUnitCore
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:315)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:330)
at java.lang.ClassLoader.loadClass(ClassLoader.java:250)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:398)
at [last line of example]
[lines from my app]