跨类加载器类加载

时间:2015-07-02 00:18:56

标签: java reflection classloader urlclassloader

我有CustomClassLoaderMap<String, byte[]>加载类。我加载的类依赖于其他卸载的类。我有UrlClassLoader中包含所述类的jar文件,它们是在CustomClassLoader之前启动的,但当CustomClassLoader尝试加载具有外部导入的类时(jar文件位于UrlClassLoader)抛出异常:

Exception in thread "main" java.lang.NoClassDefFoundError: external/class/in/urlclassloader/ClassImportedByLoadedClass
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
    at CustomClassLoader.defineClass(EncryptedByteArrayClassLoader.java:35)

我需要一些方法:

a)加载URLClassLoader

中的所有类

b)有一些方法可以将URLClassLoader设置为从内存加载的类的默认ClassLoader(而不是我的CustomClassLoader)

第35行:

public Class<?> defineClass(String name, byte[] bytes) {
    return super.defineClass(name, bytes, 0, bytes.length);
}

我尝试过设置上下文ClassLoader,如:

Thread.currentThread().setContextClassLoader(jarLoader);

其中jarLoader是URLClassLoader

有没有办法完成我想要做的事情?

1 个答案:

答案 0 :(得分:2)

您应该覆盖CustomClassLoader中的ClassLoader(ClassLoader parent)构造函数并将URLClassLoader传递到那里:

class CustomClassLoader extends ClassLoader {
     public CustomClassLoader(URLClassLoader parent, ...your data...) {
         super(parent);
         ...
     }
}

CustomClassLoader customClassLoader = new CustomClassLoader(jarLoader, ...);