2012-02-20 47 views
2

如何才能獲取僅與當前類關聯的字段,而不是所有的父類?Java - Reflection:獲取屬於當前類的字段

public class BaseClass() 
{ 
    public int x = 0; 
} 

public class AnotherClass() extends BaseClass 
{ 
    public int y = -1; 
    public int z = -2; 

    public void doStuff() 
    { 
      for(Field f : this.getClass().getFields()) 
      { 
       //Save each field to a file 
      } 
    } 
} 

我只想得到屬於AnotherClass的Y和Z.但是上面也給了我X.

這是爲了替代必須輸入我想要保存的每個值。它不會以任何典型格式保存。它必須像這樣保存,所以不建議以不同的方式保存字段。

過濾掉每個字段的名稱,有超過200會破壞這樣做的目的

回答

7

您只能獲得在類中聲明的字段getDeclaredFields.它將排除繼承的字段。

+0

它的工作原理和它的內置。非常棒! – WildBamaBoy 2012-02-20 02:12:38

1

有可能是一個更清潔的方式使用標誌的一些函數來做到這一點,但一個顯而易見的答案(和我」在過去完成)是找出this.getClass().getFields()super.getClass().getFields()陣列之間的區別。

2

可以過濾基於FieldgetDeclaredClass()

public static List<Field> fieldsDeclaredDirectlyIn(Class<?> c) { 
    final List<Field> l = new ArrayList<Field>(); 
    for (Field f : c.getFields()) 
     if (f.getDeclaringClass().equals(c)) 
      l.add(f); 
    return l; 
} 

這只是挑選和yz你的榜樣。

+1

三通。我測試了提供的代碼示例中的'getDeclaredFields()',並注意到它返回了三個元素,因此拒絕它作爲不正確的。 (是的,這比閱讀文檔要容易。)但是,我將示例代碼粘貼爲內部類,第三個字段不是BaseClass.x,它是SuperClass.this $ 0引用。讀?呸! – FauxFaux 2012-02-20 02:35:59

1

使用公共Field[] getDeclaredFields()

返回Field對象反映此Class對象所表示的類或接口聲明的所有字段的數組。這包括公共,受保護,默認(包)訪問和專用字段,但不包括繼承字段。

 Field[] fields = AnotherClass.class.getDeclaredFields(); 
     for(Field f : fields){ 
      System.out.println(f.getName()); 
     }