【问题标题】:Cross-classloader class loading跨类加载器类加载
【发布时间】:2015-07-02 00:18:55
【问题描述】:

我有一个CustomClassLoader,它从Map<String, byte[]> 加载类。我正在加载的类依赖于其他未加载的类。我的 jar 文件包含在 UrlClassLoader 之前启动的 UrlClassLoader 中的所述类,但是当 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

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

【问题讨论】:

    标签: java reflection classloader urlclassloader


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      相关资源
      最近更新 更多