我有以下Java代码段:
final Class> junitCoreClass = AccessController.doPrivileged(
new PrivilegedAction() {
@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();
这样编译就可以了.但是,当我尝试运行它时,会发生一些奇怪的事情.在最后一行抛出java.lang.NoClassDefFoundError,引用刚刚加载的类.奇怪的是,println打印确切的类名.
我检查了一下是否将新的实例引用保留为Object并仅通过反射对其进行操作,一切都很好,因此,令人讨厌的代码段必须是显式的强制转换.
有人可以向我解释为什么会发生这种情况,还可以告诉我如何实现自己的目标吗?
PS:对于那些想要查看更近的堆栈轨迹的人来说,没有什么值得展示的:
java.lang.NoClassDefFoundError: org/junit/runner/JUnitCore
at [last line of example)
[lines from my app]
Caused by: java.lang.ClassNotFoundException: org