Java 子类加载器覆盖父类



有没有办法覆盖子类加载器中的类/jar文件。

目前,我想在我的子类加载器中运行另一个 Jar 版本,该版本已经加载到我的父类加载器中。有什么可能的方法可以做到这一点吗?

你正在尝试解决一个自制的问题。如果您不希望类装入器委派给父级,请首先不要使用该父级创建类装入器。下面是一个类加载自身另一个版本的简单示例。它所要关心的不是使用自己的类加载器作为新类加载器的父级,而是使用自己的加载器的父级。

       parent loader
        ↑         ↑
my own loader    the new loader

 

import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
public class Reloader {
  static {
    System.out.println("Initializing one version of the class");
  }
  public static void main(String[] args) throws IOException, ReflectiveOperationException {
    Class<?> myClass=Reloader.class;
    ClassLoader myLoader=myClass.getClassLoader();
    URL[] u={ myClass.getProtectionDomain().getCodeSource().getLocation() };
    // don't use our class loader but its parent loader:
    try(URLClassLoader newLoader=new URLClassLoader(u, myLoader.getParent())) {
      // load another version of our class in a different loader context
      Class<?> newVersion = newLoader.loadClass(myClass.getName());
      // see: it's a different class now
      System.out.println(myClass==newVersion);
      // having the same name
      System.out.println(myClass.getName()==newVersion.getName());
      newVersion.newInstance();// trigger initializer
    }
  }
}

在Ideone上的在线测试:

标准输出

Initializing one version of the class
false
true
Initializing one version of the class

最新更新