我有一个CustomClassLoader,它从Map<String, byte[]>加载类。我要加载的类依赖于其他卸载的类。在UrlClassLoader中包含上述类的jar文件在CustomClassLoader之前启动,但是当CustomClassLoader试图加载具有外部导入(UrlClassLoader中的jar文件)的类时,会引发异常:
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设置为从内存加载的类(而不是我的CustomClassLoader)的默认ClassLoader。
第35行:
public Class<?> defineClass(String name, byte[] bytes) {
return super.defineClass(name, bytes, 0, bytes.length);
}我尝试过将上下文ClassLoader设置为:
Thread.currentThread().setContextClassLoader(jarLoader);其中jarLoader是URLClassLoader。
有什么办法能完成我想做的事吗?
发布于 2015-07-02 00:55:14
您应该在您的ClassLoader(ClassLoader parent)中重写CustomClassLoader构造函数,并将URLClassLoader传递到那里:
class CustomClassLoader extends ClassLoader {
public CustomClassLoader(URLClassLoader parent, ...your data...) {
super(parent);
...
}
}
CustomClassLoader customClassLoader = new CustomClassLoader(jarLoader, ...);https://stackoverflow.com/questions/31173719
复制相似问题