1

クラス「T」から派生した匿名クラスのフィールドを作成するクラス「S」があります。

class T {
  public void foo() {}
}

class S {
  T t1 = new T() {};
  T t2 = new T() {};
}

「foo」を呼び出すには、other の S インスタンスのすべての T フィールドを反復処理する必要があります。問題は、これが匿名クラスであるため、Field.get(...) に渡すインスタンスを作成できないことです。T インスタンスを渡すと、IllegalArgumentException が発生します...

それを機能させるチャンスはありますか?

編集

OK、Field.get() に S を渡す必要があることを理解しました。ただし、私は単純化しすぎており、状況はもう少し複雑です。S は実際には無名クラスです。

class SM { 
  class S {
    void bar() {...}

    class T {
      public void foo() {}
    }
  }
}

....

SM sm = new SM() {
  S s = new S() {
    T t1 = new T() {};
    T t2 = new T() {};
  }
}

S.bar() のすべての T フィールドにアクセスする必要があります。ありがとう!

もう一度編集

pff もちろん、「これ」を Field.get() に渡す必要があります。ありがとうございます。

4

2 に答える 2

1

field.get(Object) を呼び出すときは、呼び出しが行われるインスタンスを渡す必要があります

S s = new S();
Class<?> sClass = s.getClass();
Field[] fields = sClass.getDeclaredFields();
for(Field field : fields){
    if(field.getType().equals(T.class)){
        T instance = (T)field.get(s);
        instance.foo();
    }
}
于 2013-02-02T21:35:27.627 に答える
0

うーん、あなたの問題が本当にわかりません。どうですか:

S s = new S();
Field t1Field = S.class.getDeclaredField("t1");
t1Field.setAccessible(true);
T t1 = (T)t1Field.get(s);
t1.foo();
于 2013-02-02T21:34:12.223 に答える