2011-02-09 6 views
0

クラスの各インスタンスにURLClassLoaderによってロードされることがわかっているクラスがあります。したがって、静的な変数がある場合は、他のインスタンスにアクセスできますか?クラスの他のインスタンスは別のインスタンスの静的変数にアクセスできますか?

例えば、クラスMyClassのは、クラスローダAとクラスローダBによってロードされ、私はMyClassのは、Aによってロードされているかどうかを知りたいが、MyClassのと同じ静的フィールドは、したがって、基本的B.

によってロードされています以下になりますステートメントは常に真です:

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

@Arnaud、:フォーマットコードは確かに良いことです。しかし、タグの数を「単純化」する理由はありません。すべての5を使用することは、サイト上の質問を分類するのに役立ち、場合によっては関連する質問にリンクされた自動化されたアルゴリズムを支援するためにも役立ちます。静的変数*についてのタグはこの質問に属します。将来の編集のために覚えておいてください。 –

答えて

1

残念ながら@ Dinesh/@ DAJの答えは間違っています。 (@ロメインも多分ですが、言い回しは解析が難しいです。)

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

このための主要な基準は、JLS 4.3.4である - パラグラフ2,3

あなたは、(実行時に)区別される各参照タイプがJLS 4.12.3JLS 8.3.1.1JLS 12.4から静の異なるセットを有するであろうと推測することができると言語仕様の他の部分。


だから、基本的には、次の文は常にtrueになります:それはないでしょう。一般に

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

MyClassmyFieldをどのように初期化するかに応じて、常にの一部がの場合に該当します。たとえば、フィールドがリテラル文字列に初期化されている場合、それは行います。あなたの提案編集に関する

(これを観察するトリックはMyClassでは、実際には2つのクラスローダABによってではなく、共通の祖先のクラスローダによってをロードすることを配置することである。)

+0

ありがとうD:今私は代理人をどのように与えるのですか? O.o –

2

静的変数は、クラスローダー間で一意です。これらの値は同じかもしれません。 equalsを使うと、==を使っても動作しません。

EDIT:各ClassLoaderは異なるクラスをロードします(異なるバージョンでも可能です)。初期化された統計は異なるでしょう。異なるClassLoaderの2つの異なるクラスは、値が同じ(静的かどうか)の変数を持つことができます。

+0

あなたは "クラスローダー間でユニーク"という意味を説明する必要があります。 –

+0

また、A.loadClass( "MyClass")。equals(B.loadClass( "MyClass"))がfalseになることは本当ですか? –

0

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

+0

ああ、私はしていない。現在設定されている方法では、同時実行インスタンスは必要ありませんが、間もなく実行されます。 –

+0

通常、いくつかのコードを素早く作り、試してみたいと思います。たとえば、静的なクラスを作成するだけです。異なるローダーを使用して別のクラスにロードし、値を比較します。定義によって、「静的」はあらゆる状況において静的のように振る舞うはずです。動作が異なると、Java言語がプログラマーに提供する保証に違反します。 –

+0

ええ、私は時間の90%のように、私はそうする時間がなかった(私はURLClassLoaderを以前に使っていないし、夜10時だった:P) –