2012-10-26 57 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)時,它們使用相同的內存指針。父類加載器解決了這個問題。 –

相關問題