2011-02-09 41 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

相關問題