2010-09-16 81 views
3

我想在同一主方法中實例化兩個TCP服務器應用程序。這些服務器類使用大量的靜態和線程本地字段。是否有機會像在不同的應用程序域中一樣加載類?使用類加載器來隔離兩個靜態類

這是我的測試案例:

儀類有設置全局靜態對象簡單的getter和setter方法。

public class Tester { 

    public Tester() { 
    System.out.println(getClass().getClassLoader()); 
    } 

    public void setText(String text) { 
    GlobalObject.globalText = text; 
    } 

    public String getText() { 
    return GlobalObject.globalText; 
    } 
} 

這是可從任何地方訪問的全局對象。我想限制對這個對象的訪問。

public class GlobalObject { 

    public static String globalText; 
} 

這是我的測試程序。

public class Main { 
    public static void main(String[] args) { 
    // Default class loader; 
    Tester ta1 = new Tester(); 
    ta1.setText("test"); 
    System.out.println(ta1.getText()); 

    Tester ta2 = new Tester(); 
    System.out.println(ta2.getText()); 

    // Custom class loader; 
    CustomClassLoader ccl = new CustomClassLoader(); 

    try { 
     Tester tb = (Tester) ccl.loadClass("Tester").newInstance(); 
     System.out.println(tb.getText()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 

的輸出繼電器是:

[email protected] 
test 
[email protected] 
test 
[email protected] 
test 

我想要的輸出:

[email protected] 
test 
[email protected] 
test 
[email protected] 
null 
+0

我不能強烈建議你放棄可變靜態和線程本地人,以支持寫得很好的代碼! [添加十一個你的口味] – 2010-09-16 13:26:15

回答

3

你不告訴我們什麼CustomClassLoader是。

但是一般來說,類加載器的默認行爲是委託給它們的父類,所以默認情況下所有類加載器最終都會委託給實際的系統類加載器。

嘗試創建一個沒有父類的類加載器。這是如何使用標準類加載器:

URL[] urls = new URL[] {new File("build/classes/").toURL()}; 
ClassLoader loader = new URLClassLoader(urls, null); 

第二個構造函數參數是父類。

+0

我用這一個:http://www.javalobby.org/java/forums/t18345.html也是那一個:http://www.xinotes.org/notes/note/ 444/ – 2010-09-16 12:44:04

+0

@Firat,然後嘗試修改其構造函數以將'null'傳遞給'super'而不是'CustomClassLoader.class.getClassLoader()'。傳遞null給超級的 – 2010-09-16 12:50:41

+0

不起作用,但UrlClassLoader工作。非常感謝。 – 2010-09-16 12:56:44