类的其他实例是否能够访问另一个实例中的静态变量?

时间:2011-02-09 03:37:15

标签: java classloader static-variables

我有一个我知道的类将由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));

3 个答案:

答案 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.3JLS 8.3.1.1JLS 12.4以及语言规范的其他部分的一组不同的静态


  

基本上,以下陈述总是如此:

A.loadClass("MyClass").getField("myField").get(null)
    .equals(B.loadClass("MyClass").getField("myField").get(null));

一般来说,它不会。

某些案例中始终如此,具体取决于MyClass初始化myField的方式。例如,如果字段初始化为文字字符串,那么它将。

(观察这个的诀窍是安排两个类加载器MyClassA B 实际加载,而不是共同的祖先类加载器。)

答案 2 :(得分:0)

AFAIK,谁加载课程无关紧要。只要字段是静态的,它们应该是相同的。你试过试验一些代码吗?