Java Child Classloader覆盖父级

时间:2016-02-03 08:58:07

标签: java classloader

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

目前我想在我的子类加载器中运行另一个Jar版本,它已经加载到我的父类加载器中。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

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

       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
    }
  }
}

Online test on Ideone

  

标准输出   

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