有没有办法覆盖子类加载器中的类/ jar文件。
目前我想在我的子类加载器中运行另一个Jar版本,它已经加载到我的父类加载器中。有没有办法做到这一点?
答案 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
}
}
}
标准输出
Initializing one version of the class false true Initializing one version of the class