【发布时间】:2013-12-09 13:19:03
【问题描述】:
我的 StartApplet 很小,可以快速启动。
然后它使用 (URLClassLoader)getSystemClassLoader() 下载各种 jar 中的各种类。
我遇到的问题是 StartApplet 中定义了几个接口,这些接口使用方法调用传递给动态下载的类。我总是得到未定义的类。
系统类加载器似乎不包含任何 StartApplet 加载的类,包括接口。
所以,我尝试使用下载的 jar 将接口加载到 systemClassLoader 中,但我仍然没有定义类,我猜这是因为同一个类已经使用不同的类加载器加载了两次,因此被视为两个不同类。
我尝试使用其中一个接口(StartApplet)的类加载器加载下载的 jar,但出现错误。
我尝试忘记系统类加载器,而是使用接口的类加载器(StartApplet)创建一个新的 URLClassLoader 作为类加载器,但再次发生错误。
我已尝试将动态 jar 加载到 Thread.currentThread().getContextClassLoader() 中,但再次出现错误。
我的问题...
有没有办法使用 (URLClassLoader)getSystemClassLoader() 动态加载 jar 中的类,并允许它们查看/访问和使用已由实例化小程序加载的类??
一些代码示例会非常好。
非常感谢。
关键是系统类加载器没有引用applet类加载器。 小程序不能以任何外部 jar 启动,因此它传递的任何类都必须与小程序一起加载。 我只需要 systemclassloader 中的动态加载类就可以使用通过小程序加载的类。 请帮忙。
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)
【问题讨论】:
-
为什么不能使用applet类加载器?
-
我想通了...
-
immibis,最初我尝试过,但发生了错误,这让我相信这不是正确的解决方案。但是,我发现了一个命名冲突,并且自从更正后,我成功地使用了小程序类加载器来实现我的目标。非常感谢