我花了很多時間處理一個任務,「讀取存儲在Zipfile中存儲的Jar中的類文件」並始終返回相同的ClassNotFoundException
。我只是尋求一些關於如何進行的指導。我在各個網站上閱讀了許多有用的鏈接,但由於任務艱鉅或缺乏相關知識,我仍然遇到問題。在Zipfile中打包的Jar中發現的閱讀類
基本上,我的代碼成功讀取讀取Zipfile,創建一個JarInputstream
並找到我請求的類文件。我的問題,當代碼執行該行時找到該文件,cl.loadClass(className)
投擲ClassNotFoundException
。
URL jarUrl = new URL("jar:file:/E:/temp/ZipTest/JarTest_08262014/JarTest3.zip!/activation.jar!/com/sun/activation/viewers/ImageViewer.class");
URLClassLoader cl = URLClassLoader.newInstance(new URL[] {jarUrl });
className= "com/sun/activation/viewers/ImageViewer.class";
Class loadedClass = cl.loadClass(className);
一旦我加載了類,我可以使用反射方法來讀取類文件。我寫了一個類,用於讀取位於目錄中的jar文件。
我看着OpenJDK的javap代碼,但我沒有看到任何反射調用。所以,我迷失在這一點上。我構建了一個不正確的URL嗎?
有什麼建議嗎?
據我所知,'URLClassLoader'根本無法做到這一點。您可以在代碼中處理嵌套的'JarInputstream's,但是'URLClassLoader'實現依賴於不支持嵌套的'JarFile' ... – Holger 2014-08-29 14:10:04
您嘗試加載的類名稱應該是完全限定的類名,例如'''''''''''''''''' .viewers.ImageViewer'而不是你的'className'值。此外,可能需要在'newInstance(URL [],ClassLoader)'方法中提供application-classloader,否則某些未由此類加載器加載的類可能會拋出異常,因爲它們的字節定義對於此類加載器而言未知 – 2014-08-29 14:14:55
您可能想要從.zip中提取.jar文件並將其寫入臨時文件,然後創建一個由該臨時文件的URL組成的URLClassLoader。我非常確定URLClassLoader URLs不能是單獨的類文件;每個URL必須是.jar文件或目錄。 – VGR 2014-08-29 15:06:20