我想在同一个main方法中实例化两个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
答案 0 :(得分:3)
您没有告诉我们CustomClassLoader
是什么。
但一般来说,类加载器的默认行为是委托给它们的父类,因此默认情况下所有类加载器最终都会委托给实际的系统类加载器。
尝试创建没有父级的类加载器。这是标准类加载器的样子:
URL[] urls = new URL[] {new File("build/classes/").toURL()};
ClassLoader loader = new URLClassLoader(urls, null);
第二个构造函数参数是父。