我有一个我知道的类将由URLClassLoader为它的每个实例加载,所以如果我有一个静态变量,其他实例是否能够访问它?
例如,Class MyClass由ClassLoader A和ClassLoader B加载,我想知道A加载的MyClass是否与B加载的MyClass具有相同的静态字段。
基本上,以下陈述总是如此:
A.loadClass("MyClass").getField("MyField").get(null).equals(B.loadClass("MyClass").getField("MyField").get(null));
答案 0 :(得分:2)
静态变量在类加载器中是唯一的。 (对这些的引用)值可能相同。使用equals将起作用,使用==不会。
编辑:每个ClassLoader将加载一个不同的类(它们甚至可以是不同的版本)。初始化的静态将是不同的。来自不同ClassLoader的两个不同类可以具有值相同的变量(静态或非静态)。
答案 1 :(得分:1)
不幸的是@ Dinesh / @ DAJ的回答不正确。 (@ Romain可能也是,但措辞难以解析。)
假设您有一个类a.b.C
,并且您安排同一个类由两个不同的类加载器加载。根据规范,您将得到两个具有完全限定名称Class
的不同a.b.C
对象,并且从类型系统角度看两个不同类型。每种类型都有一组不同的静态变量。
这方面的主要参考是JLS 4.3.4 - 第2和第3段。
您可以推断出每个不同的引用类型(在运行时)将具有来自JLS 4.12.3,JLS 8.3.1.1,JLS 12.4以及语言规范的其他部分的一组不同的静态
基本上,以下陈述总是如此:
A.loadClass("MyClass").getField("myField").get(null)
.equals(B.loadClass("MyClass").getField("myField").get(null));
一般来说,它不会。
在某些案例中始终如此,具体取决于MyClass
初始化myField
的方式。例如,如果字段初始化为文字字符串,那么它将。
(观察这个的诀窍是安排两个类加载器MyClass
和A
B
实际加载,而不是共同的祖先类加载器。)
答案 2 :(得分:0)
AFAIK,谁加载课程无关紧要。只要字段是静态的,它们应该是相同的。你试过试验一些代码吗?