2016-09-22 2650 views
0

我有一個程序,我在運行時生成類(僅包含變量和關聯的getters和setter方法)。後來我想填補課程。找不到類Class.forName(),但它存在

獲取類 - 我知道它的名稱,但它不在類路徑中 - 我試過.forName()但我總是得到一個ClassNotFoundException。

這是我的例子:

Exception in thread "main" java.lang.ClassNotFoundException: com.test.wam.business.wsobjects.Testclass 
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:264) 
at gui.Application.main(Application.java:94) 

,代碼:

URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); 
    DynamicURLClassLoader dynamicURLClassLoader = new DynamicURLClassLoader(urlClassLoader); 
    dynamicURLClassLoader.addURL(new URL("file://C:\\dev\\Eclipse_was\\guitest\\generated")); 

    Class c = Class.forName("com.test.wam.business.wsobjects.Testclass"); 

    Object classInstance = c.newInstance(); 

類加載器:

public class DynamicURLClassLoader extends URLClassLoader { 

public DynamicURLClassLoader(URLClassLoader classLoader) { 
    super(classLoader.getURLs()); 
} 

@Override 
public void addURL(URL url) { 
    super.addURL(url); 
} 

}

的完全限定名稱的文件(用e創建clipse - >複製全合格的名稱)

/guitest/generated/com/test/wam/business/wsobjects/Testclass.java

這裏有什麼問題?

+2

「但它不是在類路徑」。那。 –

+1

'Class.forName'需要'class'文件,'Testclass.java'不是。 – passion

+0

我能在這種情況下做什麼 - 我只有生成的java文件和沒有類文件? – Lasirana

回答

0

的方法Class.forName(String)使用調用類的ClassLoader,如果你想使用特定的ClassLoader加載類,你需要使用Class.forName(String name, boolean initialize, ClassLoader loader),而不是爲下一個:

Class c = Class.forName(
    "com.test.wam.business.wsobjects.Testclass", true, dynamicURLClassLoader 
); 

注:這將工作如果且只有URL,您提供給您的DynamicURLClassLoader是有效的,並且是您的類的父文件夾的路徑

1

我可以看到兩個問題:

1)您正在創建一個DynamicURLClassLoader並添加該URL,但實際上並未使用它。此聲明:

Class c = Class.forName("com.test.wam.business.wsobjects.Testclass"); 

將使用加載當前類的類加載器。這可能是應用程序的默認類加載器,但它肯定不是您剛剛創建的類加載器。所述javadoc說:

[Class.forName(className)]返回與類或接口與給定字符串名稱相關聯的Class對象。調用此方法等效於:

Class.forName(className, true, currentLoader) 

其中currentLoader表示當前類的定義類裝載程序。

因此....解決的辦法是:

Class c = Class.forName("com.test.wam.business.wsobjects.Testclass", 
         true, dynamicURLClassLoader); 

2)此字符串:

"file://C:\\dev\\Eclipse_was\\guitest\\generated" 

不是有效的 「文件:」 URL。要嘗試的路徑,以引用正確的網址是:

"file:///C:/dev/Eclipse_was/guitest/generated" 

,你寫的URL 威力的工作方式,但不這樣做的正確方法。

參考:

相關問題