2013-11-24 71 views
1

我的StartApplet很小以保持啓動速度。動態加載的類無法訪問加載的Applet類

然後它使用(URLClassLoader)getSystemClassLoader()在各種瓶子中下載各種類。

我遇到的問題是在StartApplet中定義了幾個接口,它們使用方法調用傳遞給動態下載的類。我總是沒有定義班級。

看來系統類加載器不包含任何StartApplet加載的類,包括接口。

所以,我嘗試使用下載的jar加載到systemClassLoader的接口中,但我仍然沒有定義類,我猜這是因爲同一個類已經使用差分類加載器加載了兩次,因此被視爲兩個差異班。

我嘗試使用其中一個接口(StartApplet)的類加載器加載下載的jar,但出現錯誤。

我試着忘記了系統類加載器,而是使用接口(StartApplet)的類加載器作爲parant類加載器創建了一個新的URLClassLoader,但又發生了錯誤。我曾嘗試將動態罐加載到Thread.currentThread()。getContextClassLoader(),但又發生錯誤。

我的問題......

有沒有一種方法是使用(URLClassLoader的)getSystemClassLoader()動態加載罐類和讓他們看到/訪問和使用已經被裝載到由實體化小程序的類??

一些代碼示例會非常好。

很多謝謝。

關鍵是系統類加載器沒有引用applet類加載器。 該applet不能以任何外部jar開始,所以它傳遞的任何類都必須用applet加載。 我只需要systemclassloader中的動態加載的類能夠使用applet加載的類。 請幫忙。

ps。這裏有一些snipets ...

private void addPath(String _path) 
{ 
try{ 
    File f=new File(_path); 
    if(!f.exists())return; 
    if(!f.isDirectory())return; 
    Method method=SYSTEM_CLASS_LOADER_CLASS.getDeclaredMethod("addURL",parameters); 
    method.setAccessible(true); 
    method.invoke(SYSTEM_CLASS_LOADER,new Object[]{f.toURI().toURL()}); 
    }catch(Throwable _t){ 
    handle(_t); 
    disconnect();} 
} 
private void addLibrary(String _name) 
{ 
try{ 
    Method method=SYSTEM_CLASS_LOADER_CLASS.getDeclaredMethod("addURL",parameters); 
    method.setAccessible(true); 
    method.invoke(SYSTEM_CLASS_LOADER,new Object[]{ClassLoader.getSystemResource(_name)}); 
    }catch(Throwable _t){handle(_t);} 
} 


SYSTEM_CLASS_LOADER=(URLClassLoader)ClassLoader.getSystemClassLoader(); // DOESNT WORK 
SYSTEM_CLASS_LOADER=(URLClassLoader)MyInterface.class.getClassLoader(); // DOESNT WORK 
SYSTEM_CLASS_LOADER=(URLClassLoader)Thread.currentThread().getContextClassLoader(); // DOESNT WORK 

private void callWithInterface(MyInterface _myI) 
{ 
Class<?> myClass=Class.forName("dynamic.MyClass",true,SYSTEM_CLASS_LOADER); 
Constructor<?> myConstructor=myClass.getConstructor(); 
Object myInstance=myConstructor.newInstance(); 
Method m=myClass.getMethod("MyTest",new Class<?>[]{MyInterface.class}); 
String s=(String)m.invoke(myInstance,new Object[]{_myI}); 
} 

last line causes... 

Thread=Thread[Thread-17,4,http://MyDomain/-threadGroup] 
java.lang.ClassNotFoundException: MyInterface 
    java.net.URLClassLoader$1.run(-1) 
    java.net.URLClassLoader$1.run(-1) 
    java.security.AccessController.doPrivileged(-2) 
    java.net.URLClassLoader.findClass(-1) 
     java.lang.ClassLoader.loadClass(-1) 
     sun.misc.Launcher$AppClassLoader.loadClass(-1) 
     java.lang.ClassLoader.loadClass(-1) 
     java.lang.Class.forName0(-2) 
      java.lang.Class.forName(-1) 
      StartApplet.run(23759) 
      java.lang.Thread.run(-1) 
+0

爲什麼你不能使用小程序的類加載器? – immibis

+0

我已經想通了... – Penny

+0

immibis,最初我試圖但發生錯誤,導致我認爲這不是正確的解決方案。但是,我發現命名衝突,並且自從更正後,我成功使用了小程序類加載器來實現我的目標。非常感謝 – Penny

回答

1

我想通出來..

我的問題是由一個罐子名稱衝突導致所需的類在裝貨失敗造成的。一旦我意識到這一點,並糾正了這個問題,我成功地使動態加載的類能夠通過使用applet類加載器而不是系統類加載器加載動態加載的類來訪問applet加載的類。

我使用下面的行和其他調整,以適應修改我的代碼...

MyDynamicClassLoader=new URLClassLoader(new URL[0],MyAppletLoadedInterface.class.getClassLoader()); 

method.invoke(MyDynamicClassLoader,new Object[]{MyDynamicClassLoader.getResource(DynamicJarName)}); 

MyDynamicClassLoader現在擁有的所有小應用程序加載的類和引用動態加載的類與之間互相引用的能力。出於某種原因,系統類加載器不包含小程序加載的類。

問候 竹篙