gpt4 book ai didi

java - 动态加载的类无法访问Applet加载的类

转载 作者:太空宇宙 更新时间:2023-11-04 07:14:25 25 4
gpt4 key购买 nike

我的 StartApplet 很小,可以保持快速启动。

然后它使用 (URLClassLoader)getSystemClassLoader() 下载各种 jar 中的各种类。

我遇到的问题是 StartApplet 中定义了几个接口(interface),这些接口(interface)使用方法调用传递给动态下载的类。我总是得到未定义的类。

系统类加载器似乎不包含任何 StartApplet 加载的类(包括接口(interface))。

因此,我尝试使用下载的 jar 将接口(interface)加载到 systemClassLoader 中,但我仍然得到未定义的类,我猜这是因为同一个类已使用不同的类加载器加载了两次,因此被视为两个不同的类。

我尝试使用其中一个接口(interface)(StartApplet)的类加载器加载下载的 jar,但出现错误。

我尝试忘记系统类加载器,而是使用接口(interface)的类加载器(StartApplet)作为父类加载器创建一个新的 URLClassLoader,但再次发生错误。

我尝试将动态 jar 加载到 Thread.currentThread().getContextClassLoader() 中,但再次出现错误。

我的问题...

有没有办法使用 (URLClassLoader)getSystemClassLoader() 动态加载 jar 中的类,并允许它们查看/访问和使用已由实例化小程序加载的类?

一些代码示例真的很好。

非常感谢。

问题的关键是系统类加载器没有引用applet类加载器。小程序无法使用任何外部 jar 启动,因此它传递的任何类都必须随小程序一起加载。我只需要系统类加载器中动态加载的类就能够使用通过小程序加载的类。请帮忙。

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)

最佳答案

我已经明白了..

我遇到的问题是由 jar 名称冲突引起的,导致所需的类在加载时失败。一旦我意识到这一点并纠正了问题,我就通过使用 applet 类加载器而不是系统类加载器加载动态加载的类,成功地启用了动态加载的类来访问 applet 加载的类。

我使用以下几行和其他调整修改了我的代码以适应......

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

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

MyDynamicClassLoader 现在保存对所有小程序加载的类和动态加载的类的引用,并且能够相互引用。由于某种原因,系统类加载器不保存小程序加载的类。

问候佩妮

关于java - 动态加载的类无法访问Applet加载的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20182497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com