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 に信頼できる解決策があるのだろうか。便利な参照の 1 つは、Java クラスのロード元を検索することです。

手伝ってくれてありがとう!

4

1 に答える 1

1

http://www2.sys-con.com/itsg/virtualcd/java/archives/0808/chaudhri/index.htmlから答えを見つけました。

基本的に必要なのは、1つのClassLoader Aを作成して、その名前空間を別のClassLoader Bと共有することです。これを実現する方法は、ClassLoaderの親委任モデルを使用することです。ここで、ClassLoaderAは親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 に答える