gpt4 book ai didi

java - Java中如何使用不同的ClassLoader重新加载已加载的类?

转载 作者:行者123 更新时间:2023-12-01 15:05:03 25 4
gpt4 key购买 nike

public class ClassScanner
{
// scan extraClasspath for specific classes
public List<Class<?>> scanClasspathForClass(String scanCriteria)
{
...
}

public static Class<?> reloadClass(Class<?> clazz, ClassLoader clazzLoader)
{
// Question: how to reload a loaded class (ClassScanner in this example) with a different arbitrary ClassLoader?
}

// an example of how reloadClass() would be used
// in real case, this function would be in different class
public List<Class<?>> scan(URL[] extraClasspath)
{
URLClassLoader urlClazzLoader = new URLClassLoader(extraClasspath, null);
Class<?> newClass = reloadClass(ClassScanner.class, urlClazzLoader);
return ((ClassScanner) newClass.newInstance()).scanClasspathForClass();
}
}

上面的代码演示了这个问题以及为什么它是一个问题。我需要实现reloadClass()。我想知道Java 1.6是否有可靠的解决方案。一个有用的引用是 Find where java class is loaded from .

感谢您的帮助!

最佳答案

我从 http://www2.sys-con.com/itsg/virtualcd/java/archives/0808/chaudhri/index.html 找到了答案.

基本上,我需要的是使一个类加载器 A 与另一个类加载器 B 共享其 namespace 。我发现实现此目的的方法是使用类加载器父委托(delegate)模型。这里,ClassLoader A 是父 ClassLoader。

public List<Class<?>> scan(URL[] extraClasspath) throws Exception
{
URLClassLoader urlClazzLoader = new URLClassLoader(extraClasspath, ClassScanner.class.getClassLoader());
return urlClazzLoader.loadClass(ClassScanner.getName()).newInstance();
}

关于java - Java中如何使用不同的ClassLoader重新加载已加载的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13080351/

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