2016-09-07 22 views
0

我有一些問題,如何從另一個目錄爪哇 - 類初始包從另一個目錄

File file=new File("D:\\java\\myproject\\Name_pack\\time\\MyClass.class"); 
URL[] cp = 
{ 
    new File(file.getParent()).toURI().toURL() 
}; 
URLClassLoader urlcl = new URLClassLoader(cp); 
Class cls = urlcl.loadClass(file.getName().replaceAll("\\.class",""); 

如果類文件不包含封裝,它的工作從初始類文件包。
但它是一個包,我得到一些錯誤,這樣的:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: Waktu (wrong name: Name_pack/time/MyClass) 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:760) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:455) 
at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:367) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:360) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 

我不知道怎麼去包裝。

所以,我想最初是這樣的:

Class cls = urlcl.loadClass(Name_pack.time.MyClass); 

回答

1

如果你有,沒有發行代碼庫,也不是類的預期包知識絕對路徑,事情就變得複雜了。實際的全限定名稱包含在類文件中,這就是類加載器拒絕它的原因;它甚至會告訴你異常消息中的實際名稱,但是,不能保證異常消息將包含該信息。

因爲我不假設你想開始解析字節碼來找到實際的類名,所以我建議重新設計應用程序以在第一個接收類路徑目錄(代碼庫)和全限定類名地點。

一個簡單的,但並不推薦使用,可能只是想它:

File file=new File("D:\\java\\myproject\\Name_pack\\time\\MyClass.class"); 
String className=file.getName(); 
if(!className.endsWith(".class")) 
    throw new IllegalArgumentException(file.toString()); 
className=className.substring(0, className.lastIndexOf('.')); 
File codeBase=file; 
Class cls = null; 
do { 
    codeBase=codeBase.getParentFile(); 
    URL[] cp = { codeBase.toURI().toURL() }; 
    URLClassLoader urlcl = new URLClassLoader(cp); 
    try { cls = urlcl.loadClass(className); } 
    catch(NoClassDefFoundError ex) { 
     className=codeBase.getName()+'.'+className; 
    } 
} while(cls==null); 

但正如所說,最好的選擇是讓,不管來源提供你的文件,提供正確的代碼庫目錄第一名...