1

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

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不知道额外的 jar,因此classFromJar无法加载依赖项。

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

我想纯粹在运行时实现这一点,而不需要自定义“java.class.path”系统属性或 JVM-Djava.system.class.loader开关。

4

0 回答 0