我有一个CustomClassLoaderMap<String, byte[]>加载类。我要加载的类取决于其他未加载的类。我在UrlClassLoader之前启动的CustomClassLoader中有包含上述类的jar文件,但是当CustomClassLoader尝试加载具有外部导入的类(UrlClassLoader中的jarfile)时,会引发异常:

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

有什么方法可以完成我想做的事情?

最佳答案

您应该在ClassLoader(ClassLoader parent)中覆盖CustomClassLoader构造函数,并在其中传递URLClassLoader

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

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

关于java - 跨类加载器的类加载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31173719/

10-11 03:28