0

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

比如ClassLoader A和ClassLoader B分别加载了Class MyClass,我想知道A加载的MyClass是否会和B加载的MyClass有相同的静态字段。

所以基本上,以下陈述是否总是正确的:

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

3 回答 3

2

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

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

于 2011-02-09T03:41:06.973 回答
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实际上两个类加载器A和加载B,而不是由一个共同的祖先类加载器加载。)

于 2011-02-09T04:03:53.673 回答
0

AFAIK,谁加载课程并不重要。只要字段是静态的,它们就应该是相同的。您是否尝试过一些代码?

于 2011-02-09T03:41:55.913 回答