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

时间:2013-11-24 23:31:33

标签: java class jar applet

我的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)

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加载的类。

此致 便士

相关问题