0

各インスタンスの 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));
4

3 に答える 3

2

静的変数は、クラスローダ全体で一意です。(これらへの参照) 値は同じである可能性があります。equals を使用すると機能しますが、== を使用すると機能しません。

編集: 各 ClassLoader は異なるクラスをロードします (異なるバージョンであってもかまいません)。初期化された統計は異なります。異なる ClassLoader の 2 つの異なるクラスは、同じ値の変数 (静的かどうかに関係なく) を持つことができます。

于 2011-02-09T03:41:06.973 に答える
1

残念ながら、@ Dinesh /@DAJの答えは正しくありません。(@Romainも多分そうですが、文言を解析するのは難しいです。)

クラスa.b.Cがあり、同じクラスが2つの異なるクラスローダーによってロードされるように調整するとします。仕様によればClass、完全修飾名を持つ2つの異なるオブジェクトが作成さa.b.Cれ、型システムの観点からは2つの異なるタイプが作成されます。タイプごとに、静的変数の異なるセットがあります。

これに関する主な参考資料は、JLS4.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));

一般的にはそうではありません。

初期化の方法によっては、常にtrueになる場合があります。たとえば、フィールドがリテラル文字列に初期化されている場合は、そうなります。 MyClassmyField

(これを観察する秘訣は、共通の祖先クラスローダーではなく、2つのクラスローダーとによって実際にロードMyClassされるように調整することです。)AB

于 2011-02-09T04:03:53.673 に答える
0

私の知る限り、誰がクラスをロードするかは問題ではありません。フィールドが静的である限り、それらは同じである必要があります。いくつかのコードを試してみましたか?

于 2011-02-09T03:41:55.913 に答える