2

私は次の状況にいます:

public class SuperClass
{
        public static Object superClassStaticField;
}

public class ChildClass extends SuperClass
{
... some methods and fields
}

次のようなメソッドがあります。

...modifiers... void action(Class <? extends SuperClass> cls)
{
...
}

私は(後でChildClassで)初期化するスーパークラスの静的フィールドを含むリフレクションですべての要素に到達したいと思いますが、リフレクションでいくつかのロジックが失敗するように見えます:

superClassStaticField はスーパークラスにあるため、到達しようとすると:

cls.getClass().get[Declared]Field("superClassStaticField");

私は java.lang.NoSuchFieldException を取得します

したがって、スーパークラスに到達する必要があります。

SuperClass.class.getDeclaredField("superClassStaticField").get(null);

正常に動作しますが、複数の ChildClass が同じランタイムで動作する場合、私のプログラムはおかしくなります。すべてのメソッドが SuperClass で宣言されている同じオブジェクトに到達するためだと思います。

しかし、実際に指定されたクラスの静的フィールドに到達するにはどうすればよいですか?

私は試した:

SuperClass.class.getDeclaredField("superClassStaticField").get(cls);

しかし、結果は同じです。

どうすれば到達できますか?

編集:静的フィールドのみを取得/設定したいのですが、新しいインスタンスを作成するのは安全ではありません(空のコンストラクターがあり、何も変更しませんか?)

4

3 に答える 3

6

しかし、実際に指定されたクラスの静的フィールドに到達するにはどうすればよいですか?

静的フィールドは 1 つだけです。サブクラスごとに静的フィールドが 1 つになるわけではありません。別のアプローチを取る必要があるようです。あなたが何を達成しようとしているのかわからないので、そのアプローチがどうあるべきかについて多くのアドバイスを与えることはできません. おそらくMap<Class, Object>あなたが求めているのはaですか?

于 2013-07-19T16:08:38.737 に答える
1

まず、静的フィールドは、それらが定義されている実際のクラスに属しています。サブクラスからの参照からのリフレクションを介してアクセスすることはできません。つまり、リフレクションを使用します。

SuperClass.field // OK - the field is declared on SuperClass
SubClass.field // Not found - the field is not declared on SubClass

検査しているクラスのスーパークラスでフィールドを見つけようとして(繰り返し)階層を上ることで、リフレクションを使用してフィールドを見つけることができます。

clz.getSuperclass().getField("superClassStaticField")

階層の深さによっては、複数のスーパー クラスを経由する必要がある場合があります。

最後に、フィールドはスーパー クラスに属し、すべてのサブクラスに対して1 つのスーパー クラスしかないため、すべてのサブクラスが同じスーパークラス フィールドを使用します。

于 2013-07-19T16:10:37.260 に答える