2012-10-26 63 views
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如何在Java中使用不同的ClassLoader重载一个加载的类?

感谢您的帮助!

+0

看到了吗? http://tutorials.jenkov.com/java-reflection/dynamic-class-loading-reloading.html#example – Nishant

+0

谢谢。看见了。问题是,首先这个班可能来自任何地方。我怀疑'ClassLoader.getResource()'或'Class.getProtectionDomain()。getCodeSource()。getLocation()'是可靠的。其次,如果我可能要求简单的解决方案而不定义我的ClassLoader? –

回答

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(); 
} 
+0

我想我在回答类似的问题之前:[Java ClassLoader Confusion](http://stackoverflow.com/a/10990094/697630) –

+0

感谢您的参考。然而,就我而言,我所需要的是让两个类共享一个相同的名称空间,以便当它们引用某个单例对象(如FooBar.class)时,它们使用相同的内存指针。父类加载器解决了这个问题。 –

相关问题