如何使LoadedClass.class.getClassLoader()返回自定义ClassLoader?

时间:2016-06-05 13:15:17

标签: java classloader urlclassloader dynamic-class-loaders

我想创建一个通过几个第三方jar扩展classpath的类加载器。目前我的代码如下所示:

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        ClassLoader originalClassLoader = Main.class.getClassLoader();
        URL[] jarUrls = ...;
        ClassLoader customClassLoader =  URLClassLoader.newInstance(jarUrls, originalClassLoader);
        Class classFromJar = customClassLoader.loadClass("class.from.Jar");

        originalClassLoader.equals(classFromJar.getClassLoader()); // true
        customClassLoader.equals(classFromJar.getClassLoader()); // false
        // I want classFromJar.getClassLoader() to return customClassLoader
    }
}

问题是即使使用ClassLoader#loadClass加载的类工作正常,加载类的方法#getClassLoader也会返回原始的类加载器而不是自定义类加载器。这种状态会导致classFromJar.newInstance()之类的调用抛出ClassNotFoundExeption,因为originalClassLoader并不了解其他广告,因此classFromJar的依赖关系无法加载。< / p>

如何让自定义类加载器将其自身传播到加载类的Class#getClassLoader结果?

我希望纯粹在运行时实现这一点,而无需定制&#34; java.class.path&#34;系统属性或JVM -Djava.system.class.loader切换。

0 个答案:

没有答案