簡體   English   中英

如何使用Java反射從字段中獲取擴展類的匿名實例?

[英]How to get an anonymous instance that extends a class from a field with java reflection?

我有一個“ 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()。 謝謝大家,對此感到抱歉,我感到很蠢。

調用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();
    }
}

嗯,真的看不到你的問題。 怎么樣:

S s = new S();
Field t1Field = S.class.getDeclaredField("t1");
t1Field.setAccessible(true);
T t1 = (T)t1Field.get(s);
t1.foo();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM