gpt4 book ai didi

java - 重新加载使用自定义类加载器加载的类

转载 作者:太空宇宙 更新时间:2023-11-04 10:51:11 24 4
gpt4 key购买 nike

以下是我的自定义类加载器类。我使用以下 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)的类的类定义。我该怎么做?

最佳答案

您应该创建一个类加载器,它将自行加载客户类,不要让 super 加载它们。试试我的例子,它可能有助于理解

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());

}
}

关于java - 重新加载使用自定义类加载器加载的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47833714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com