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

标签 java class reflection

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/

相关文章:

java - 在 Spring MVC 应用程序中使用 Selenium WebDriver 进行前端测试

android - 启动时无法在 Android 应用程序中实例化 fragment

Python - self ,没有 self 和 cls

Java:调用目标异常

java - 拆分逗号分隔忽略最后一项

java - OSX 升级后,eclipse 缺少 applescriptengine.jar

java - 当数组中的参数时调用 Method.invoke()

java - 什么是invokedynamic,我该如何使用它?

java - Android 模拟器无法启动应用程序

python - 无法访问父类中定义的方法