2013-09-24 100 views
1

我在運行時成功加載了一個類,並在該類上調用了newInstance(),並從中創建了一個對象。類加載問題

但是,後來在程序中,我試圖再次按名稱找到該類。由於某種原因,該程序無法找到它。

下面的代碼:

MyClassLoader mcl = new MyClassLoader(); 
Class<?> c = mcl.loadClass("models." + getModelClassName(), getByteCode()); 

這裏是MyClassLoader loadClass方法:

public Class<?> loadClass(String className, byte[] classData){ 
      return this.defineClass(className,classData,0,classData.length); 
     } 

無論如何,看來我已經成功加載的類,因爲我可以調用的newInstance在新加載類「c」:

 Object o = c.newInstance(); 

(所以,沒有問題,但)。

但是,後來在節目中,我提出以下電話:

Class<? extends DB4oModel> dbClass = null; 

try{ 

    dbClass = (Class<? extends DB4oModel>) Class.forName("models."+className); 

} catch(ClassNotFoundException e1){ 

     // this exception is thrown by my program !! 

} 

我只能猜測哪些問題可能是類已成功加載了一個類裝載器,但其他類加載器不知道這個班級? 我真的不知道。請幫忙,謝謝。

+1

請您分享您正在接受的異常? – NCA

+1

我認爲你的想法是真實的。爲什麼不使用類加載器獲取實例,而是使用class.forname – Subin

+0

異常是:java.lang.ClassNotFoundException:java.net.URLClassLoader上的models.MyModelClass $ 1.run(Unknown Source)java.security.AccessController。在java.lang.Class的sun.misc.Launcher $ AppClassLoader.loadClass(Unknown Source)處的java.net.URLClassLoader.findClass(未知源代碼)上的java.lang.ClassLoader.loadClass(Unknown Source)處的doPrivileged(Native Method)。 forName0(本地方法)在java.lang.Class.forName(未知源)。 etc ... –

回答

1

您需要指定類加載器(已加載模型類)作爲Class.forName()中的參數;

請參閱this!

+0

好吧,謝謝 –