2016-04-09 88 views
0

我試圖從坐在我的桌面目錄中的一些編譯的類文件加載類對象。加載外部類文件,而不考慮類路徑或包

我在我的程序中給主要兩個參數餵食,它使用URLClassLoader從編譯文件TheClassToLoad.class獲得一個類的實例。

我,在類裝入程序的主:(args[0] is for something unrelated)

String classFile_FilePath = args[1]; 
String className = args[2]; 
URL classUrl = new URL(classFile_FilePath); 
URLClassLoader ucl = new URLClassLoader(new URL[]{classUrl}); 

當從shell中運行該程序時在項目目錄:

Me:ClassLoadingProgramRootDir Me$ java com.company.Main argZero file:///Users/Me/Desktop/ TheClassToLoad.class

我發現引發異常:

線程「main」中的異常java.la ng.ClassNotFoundException:TheClassToLoad.class

因此,有在Desktop/文件TheClassToLoad.classURLClassLoader拋出一個異常,而不提供我需要調試的情況的詳細信息。

我是Java新手,知道像com.company.Class這樣的類路徑經常需要引用基於包目錄結構的類的真實類名。然而,在這種情況下,我只是要求URLClassLoader給我一個位於機器某處的任意編譯類文件的類對象實例。

+1

如果您的班級有'包'語句,您在嘗試加載和使用時需要尊重它。 – bmargulies

回答

1

對於URLClassLoader,URL應該是包含類+包結構的目錄,而不是類文件本身。在你的情況下,它應該是file:///Users/Me/Desktop/

loadClass的參數應該是類的名稱,而不是類文件的名稱。你的情況應該是TheClassToLoad

如果該類在包中(例如,my.pkg.TheClassToLoad),那麼你應該使用類名作爲參數的loadClass,併爲URLClassLoader的網址仍然應該如果封裝結構(例如,file:///Users/Me/Desktop根文件是file:///Users/Me/Desktop/my/pkg/TheClassToLoad.class)。

+0

謝謝,不使用「完全指定」類名稱是根本原因 –

相關問題