Java 包含多个jar实例的容器,该jar具有一个包含静态变量的类

Java 包含多个jar实例的容器,该jar具有一个包含静态变量的类,java,static,jar,containers,Java,Static,Jar,Containers,我有一个类a包含一个名为b的静态/单例成员 这个类包含在jarx中,它出现在多个位置 我的问题是: 容器中是否存在具有此代码库的多个JARX副本(因此是A类) 如果是这样,每当我有作业A.b=10;,A的哪一份副本的b成员将获得分配?我目前有一个问题似乎是由这个场景引起的,即即使将静态变量设置为某个值,我在读取它的代码的另一部分中也会得到一个空值。要避免/克服这个问题,正确的“模式”是什么(假设我的诊断是正确的) -KS这里有一点关于不同的类加载器的想法: package test; impo

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

这个类包含在jarx中,它出现在多个位置

我的问题是:

  • 容器中是否存在具有此代码库的多个JARX副本(因此是A类)
  • 如果是这样,每当我有作业A.b=10;,A的哪一份副本的b成员将获得分配?我目前有一个问题似乎是由这个场景引起的,即即使将静态变量设置为某个值,我在读取它的代码的另一部分中也会得到一个空值。要避免/克服这个问题,正确的“模式”是什么(假设我的诊断是正确的)

  • -KS

    这里有一点关于不同的
    类加载器的想法:

    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而言,这些类并不相同


    最后,当我尝试一个应该有效的演员阵容时,它失败了。因为加载
    class1
    ClassLoader
    与用于运行测试的
    ClassLoader
    不在相同的
    ClassLoader
    层次结构中。因此,它创建的对象
    ob1
    与测试本身的
    Class
    不兼容。

    取决于您使用的类加载器以及它们的设置方式。