失敗,我已經對Java代碼下面的代碼片段:動態類加載運行時
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();
編譯沒有問題。但是當我嘗試運行它時,發生了一些奇怪的事情;一個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.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]
請向我們展示異常的完整堆棧跟蹤。 – 2010-05-21 23:23:19