具有带静态变量的类的jar的多个实例的容器

时间:2011-09-14 07:30:02

标签: java static jar containers

我有一个A类包含一个名为b的静态/单例成员。

此类包含在jar X中,它出现在多个位置。

我的问题是:

  1. 具有此代码库的容器中是否存在jar X(以及A类)的多个副本?
  2. 如果是这样,每当我有一个作业A.b = 10 ;,哪个A副本的b成员将获得作业?我目前有一个似乎是由这种情况引起的问题,即使在将静态变量设置为某个值之后,我在读取它的代码的另一部分中得到一个空值。避免/克服这个问题(假设我的诊断是正确的),遵循什么样的“模式”?
  3. -KS

1 个答案:

答案 0 :(得分:0)

这里有一些关于不同ClassLoader s:

的概念
package test;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;

public class StaticMemberTest {
    public static int count = 0;

    public static void main(String[] args) throws Exception {
        // my .class files are in bin, relative to where I run the test from
        File f = new File("./bin");
        URL u = f.toURL();

        ClassLoader classLoader1 = new URLClassLoader(new URL[] { u }, null);
        ClassLoader classLoader2 = new URLClassLoader(new URL[] { u }, null);

        Class class1 = classLoader1.loadClass("test.StaticMemberTest");
        System.out.println("class1=" + class1);
        System.out.println("class1.count=" + class1.getDeclaredField("count").get(null));

        Class class2 = classLoader2.loadClass("test.StaticMemberTest");
        System.out.println("class2=" + class2);
        System.out.println("class2.count=" + class2.getDeclaredField("count").get(null));

        class1.getDeclaredField("count").set(null, new Integer(99));

        System.out.println("class1.count=" + class1.getDeclaredField("count").get(null));
        System.out.println("class2.count=" + class2.getDeclaredField("count").get(null));

        System.out.println("class1.isAssignableFrom(class2)=" + class1.isAssignableFrom(class2));
        System.out.println("class2.isAssignableFrom(class1)=" + class2.isAssignableFrom(class1));

        Object ob1 = class1.newInstance();
        System.out.println("ob1=" + ob1);

        StaticMemberTest test = (StaticMemberTest) ob1;
    }
}

输出

class1=class test.StaticMemberTest
class1.count=0
class2=class test.StaticMemberTest
class2.count=0
class1.count=99
class2.count=0
class1.isAssignableFrom(class2)=false
class2.isAssignableFrom(class1)=false
ob1=test.StaticMemberTest@35ce36
Exception in thread "main" java.lang.ClassCastException: test.StaticMemberTest
    at test.StaticMemberTest.main(StaticMemberTest.java:37)

所以你可以看到类名是相同的,并且两个计数都从零开始。但您可以单独设置静态变量值。

此外,isAssignableFrom测试表明,就JVM而言,这些类并不相同。

最后,当我尝试一个应该可行的演员表时,它会失败。因为加载ClassLoader的{​​{1}} 与用于运行测试的class1相同的ClassLoader层次结构中。因此,它创建的对象ClassLoader与测试本身的ob1不兼容。