使用classloader隔离两个静态类

时间:2010-09-16 12:29:22

标签: java classloader

我想在同一个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

1 个答案:

答案 0 :(得分:3)

您没有告诉我们CustomClassLoader是什么。

但一般来说,类加载器的默认行为是委托给它们的父类,因此默认情况下所有类加载器最终都会委托给实际的系统类加载器。

尝试创建没有父级的类加载器。这是标准类加载器的样子:

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

第二个构造函数参数是父。