跨类加载器类加载



我有一个CustomClassLoader,它从Map<String, byte[]>加载类。我正在加载的类依赖于其他已卸载的类。我在CustomClassLoader之前启动的UrlClassLoader中有包含上述类的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是CCD_ 7。

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

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

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

相关内容

  • 没有找到相关文章