Java 包含多个jar实例的容器,该jar具有一个包含静态变量的类
我有一个类a包含一个名为b的静态/单例成员 这个类包含在jarx中,它出现在多个位置 我的问题是: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
-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
不兼容。取决于您使用的类加载器以及它们的设置方式。