包含Jars的Jars中的类的替换系统类加载器

Ola*_*eni 14 java jar classloader

到目前为止,我看到的自定义ClassLoader示例涉及子类化URLClassLoader,并使用该特定实例加载资源中的类.

我徒劳地试图寻找替换SystemClassLoader的替代方法,以便可以为不在类路径中的类查询我的ClassLoader.

我试过了Thread.currentThread().setContextClassLoader,但似乎没有用.

它甚至可能吗?

Xye*_*ene 12

虽然这是一个老问题,但确实有一种方法可以替换系统ClassLoader.然而,通过反思,你可能会得到比你讨价还价更多的东西.

        Field scl = ClassLoader.class.getDeclaredField("scl"); // Get system class loader
        scl.setAccessible(true); // Set accessible
        scl.set(null, new YourClassLoader()); // Update it to your class loader
Run Code Online (Sandbox Code Playgroud)

这应该适用于Oracle JVM.

  • 这当然是一个黑客,取决于可以在java版本之间更改的私有变量,但它允许我解决一个jar的问题和第三方依赖中的代码,该第三方依赖调用System.getClassLoader()来加载类.推动一个罐子的类装载器到达了诀窍. (3认同)

Tar*_*log 10

使用java.system.class.loader属性运行JVM :

java -Djava.system.class.loader=myClassLoader myApplication
Run Code Online (Sandbox Code Playgroud)

  • 我正在寻找一种可以排除修改JVM命令行的解决方案 (3认同)