我的StartApplet很小,可以快速启动。
然后使用(URLClassLoader)getSystemClassLoader()在各种jar中下载各种类。
我遇到的问题是StartApplet中定义了几个接口,这些接口使用方法调用传递给动态下载的类。我总是让课程没有定义。
系统类加载器似乎不包含任何包含接口的StartApplet加载类。
所以,我尝试使用下载的jar将接口加载到systemClassLoader但我仍然得到类没有定义,我想这是因为同一个类已经使用差异类加载器加载了两次,因此被视为两个区别类。
我尝试使用其中一个接口(StartApplet)的类加载器加载下载的jar,但是有错误。
我试图忘记系统类加载器,而是使用接口的类加载器(StartApplet)创建一个新的URLClassLoader作为parant类加载器,但又出现了错误。
我已经尝试将动态jar加载到Thread.currentThread()。getContextClassLoader()但是又出现了错误。
我的问题......
有没有办法使用(URLClassLoader)getSystemClassLoader()在jar中动态加载类,并允许它们查看/访问并使用已经由实例化applet加载的类?
一些代码示例非常好。
非常感谢。
关键是系统类加载器不引用applet类加载器。 applet无法从任何外部jar启动,因此它传递的任何类都必须与applet一起加载。 我只需要systemclassloader中动态加载的类就能够使用applet加载的类。 请帮忙。
PS。这里有一些狙击手......
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 :(得分:1)
我已经弄清楚了..
我遇到的问题是由于jar名称冲突导致所需的类在加载时失败。一旦我意识到这一点并纠正了问题,我就成功启用了动态加载的类,通过使用applet类加载器而不是系统类加载器加载动态加载的类来访问applet加载的类。
我使用以下行和其他调整来修改我的代码以适应...
MyDynamicClassLoader=new URLClassLoader(new URL[0],MyAppletLoadedInterface.class.getClassLoader());
method.invoke(MyDynamicClassLoader,new Object[]{MyDynamicClassLoader.getResource(DynamicJarName)});
MyDynamicClassLoader现在保存对所有applet加载类和动态加载类的引用,并且能够相互引用。由于某种原因,系统类加载器不保存applet加载的类。
此致 便士