我的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)
爲什麼你不能使用小程序的類加載器? – immibis
我已經想通了... – Penny
immibis,最初我試圖但發生錯誤,導致我認爲這不是正確的解決方案。但是,我發現命名衝突,並且自從更正後,我成功使用了小程序類加載器來實現我的目標。非常感謝 – Penny