有没有办法覆盖子类加载器中的类/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