我有一个“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()。谢谢大家,对不起,我感觉很蠢。
答案 0 :(得分: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();
}
}
答案 1 :(得分:0)
S s = new S();
Field t1Field = S.class.getDeclaredField("t1");
t1Field.setAccessible(true);
T t1 = (T)t1Field.get(s);
t1.foo();