2011-02-09 16 views
0

我有一个我知道的类将被URLClassLoader加载它的每个实例,所以如果我有一个静态变量,其他实例是否能够访问它?类的其他实例是否能够访问另一个类中的静态变量?

例如,MyClass类是由类加载器和类加载器加载乙,我想知道如果有一个加载MyClass的都会有相同的静态字段为MyClass的加载由B.

所以基本上,将以下语句始终为真:

A.loadClass("MyClass").getField("MyField").get(null).equals(B.loadClass("MyClass").getField("MyField").get(null)); 
+0

@Arnaud,对于您的建议编辑:格式化代码确实是一件好事。但没有理由“简化”标签的数量。甚至鼓励使用全部5个,因为它有助于对网站上的问题进行分类,并帮助自动算法处理链接的可能相关问题。关于静态变量*的标签肯定属于这个问题。只是要记住将来的编辑。 – 2011-02-09 03:50:22

回答

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的方式,它在的某些个案中将始终为真。例如,如果该字段被初始化为文字字符串,那么它会。

(诀窍观察这个安排是MyClass实际上是由两个类加载器AB,而不是由一个共同的祖先类加载器加载

2

静态变量在类加载器中是唯一的。 (引用这些是)值可能是相同的。使用等于将工作,使用==不会。

编辑:每个ClassLoader将加载一个不同的类(它们甚至可以是不同的版本)。初始化的静态会有所不同。来自不同类加载器的两个不同类可以具有相同值的变量(静态或非静态)。

+0

你应该解释你的意思是“独特的类加载器”。 – 2011-02-09 04:15:16

+0

A.loadClass(“MyClass”)。equals(B.loadClass(“MyClass”))是否将为false? – 2011-02-09 13:14:02

0

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

+0

啊,不,我没有。它目前的设置方式,不需要并发实例,但很快会出现。 – 2011-02-09 03:43:22

相关问题