0
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

感谢帮助!

4

1 回答 1

1

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

基本上我需要的是让一个 ClassLoader A 与另一个 ClassLoader B 共享其命名空间。我发现实现这一点的方法是使用 ClassLoader 父委托模型。这里,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();
}
于 2012-10-26T21:09:04.833 回答