【问题标题】:Dynamically loaded Class cannot access Applet loaded Class动态加载的 Class 无法访问 Applet 加载的 Class
【发布时间】: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,最初我尝试过,但发生了错误,这让我相信这不是正确的解决方案。但是,我发现了一个命名冲突,并且自从更正后,我成功地使用了小程序类加载器来实现我的目标。非常感谢

标签: java class jar applet


【解决方案1】:

我想通了..

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

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

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

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

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

问候 一分钱

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2014-03-03
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多