[英]using classloader for isolating two static classes
我想在同一主方法中實例化兩個TCP服務器應用程序。 這些服務器類使用大量靜態和線程本地字段。 是否有機會加載類似於不同應用程序域的類?
這是我的測試用例:
Tester類具有用於設置全局靜態對象的簡單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();
}
}
}
輸出是:
sun.misc.Launcher$AppClassLoader@11b86e7
test
sun.misc.Launcher$AppClassLoader@11b86e7
test
sun.misc.Launcher$AppClassLoader@11b86e7
test
我想要的輸出:
sun.misc.Launcher$AppClassLoader@11b86e7
test
sun.misc.Launcher$AppClassLoader@11b86e7
test
sun.misc.Launcher$AppClassLoader@1234567
null
您沒有告訴我們CustomClassLoader
是什么。
但一般來說,類加載器的默認行為是委托給它們的父類,因此默認情況下所有類加載器最終都會委托給實際的系統類加載器。
嘗試在沒有父級的情況下創建類加載器。 這是使用標准類加載器的樣子:
URL[] urls = new URL[] {new File("build/classes/").toURL()};
ClassLoader loader = new URLClassLoader(urls, null);
第二個構造函數參數是父級。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.