我有一个A类包含一个名为b的静态/单例成员。
此类包含在jar X中,它出现在多个位置。
我的问题是:
-KS
答案 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
不兼容。