![](/img/trans.png)
[英]How to reload a loaded class with different ClassLoader in Java?
[英]Reload class which is loaded using custom classloader
以下是我的自定義類加載器類。 我使用以下javaargs將其設置為默認類加載器。
-Djava.system.class.loader=MyCustomClassLoader
import java.io.*;
public class MyCustomClassLoader extends ClassLoader {
public MyCustomClassLoader() { super(); }
public MyCustomClassLoader(ClassLoader parent) { super(parent); }
protected Class loadClass(String name, boolean resolve ) throws ClassNotFoundException {
Class c = super.loadClass(name, resolve );
System.out.println( "name: " + name + ", class: " + c);
return c;
}
}
此時,當我啟動服務器時,所有類都使用上面的自定義類加載器類加載。 我希望根據需要更新/重新加載屬於特定程序包(例如com.test)的類的類定義。 我該怎么做?
您應該創建一個類加載器,該類加載器將自己加載custor類,不要讓它們超級加載。 試試我的例子,可能有助於理解
package test;
import java.io.IOException;
import java.net.MalformedURLException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
class MyClassLoader extends ClassLoader {
private Map<String, Class<?>> loadedClasses = new HashMap<>();
private String dir;
public MyClassLoader(String dir) throws MalformedURLException {
this.dir = dir;
}
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
Class<?> c = findLoadedClass(name);
if (c != null) {
return c;
}
c = loadedClasses.get(name);
if (c != null) {
return c;
}
try {
String path = dir + name.replace(".","/") + ".class";
byte[] bytes = Files.readAllBytes(Paths.get(path));
c = defineClass(name, bytes, 0, bytes.length, null);
if (resolve) {
resolveClass(c);
}
return c;
} catch (IOException ex) {
return super.loadClass(name, resolve);
}
}
}
public class ChildFirstClassLoader {
public static void main(String[] args) throws Exception {
ClassLoader cl1 = new MyClassLoader("target/classes/");
Object x1 = cl1.loadClass("test.X1").newInstance();
System.out.println(x1.getClass().getClassLoader());
cl1 = null;
ClassLoader cl2 = new MyClassLoader("target/classes/");
x1 = cl2.loadClass("test.X1").newInstance();
System.out.println(x1.getClass().getClassLoader());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.