1

我有一个类“S”,在其中创建从类“T”派生的匿名类的字段:

class T {
  public void foo() {}
}

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

我需要遍历另一个 S 实例的所有 T 字段来调用“foo”。问题是我无法创建一个实例来传递给 Field.get(...) 因为这是一个匿名类。如果我传递一个 T 实例,我会得到一个 IllegalArgumentException...

有没有机会让它发挥作用?

编辑

好的,我现在明白我应该将 S 传递给 Field.get()。但是我过于简单化了,情况有点复杂。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 当然,我需要将“this”传递给 Field.get()。谢谢大家,对不起,我感觉很笨。

4

2 回答 2

1

When you call field.get(Object) you need to pass an instance on which the call will be made

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

Hhmm, don't really see your problem. How about:

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 回答