2013-03-11 148 views
1

我得到2個類:B延伸A通過反射獲取子類字段

我在類B上使用getDeclaratedFields(),並且我沒有從A類獲得字段。

我該如何得到它們?

+0

請分享您用於從poi導出的代碼。很有可能你沒有關閉相同的東西。 – Joe2013 2013-03-11 09:14:49

+0

分享一些代碼會給更好的主意 – 2013-03-11 13:12:13

+0

文件是否保存爲只讀?工作表是否受到保護以禁止此類修改? – shahkalpesh 2013-03-11 15:43:48

回答

1

getDeclaredFields()返回由類而不是超類聲明的字段。

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

使用getFields方法檢索由類和超類聲明的字段。

具體地,如果該Class對象表示一個類,則此方法返回 這個類的公共字段和它的所有超

Java Class以獲取更多信息的。

0

您應該使用Class#getSuperclass()訪問類的超類,並使用Class#getDeclaredFields()獲取其字段,重複(遞歸)直到您到達Object或您希望停止的選擇類。

下面是一些示例代碼:

@Test 
public void getDeclFieldsIncludingBase() { 
    List<Field> fields = new ArrayList<>(); 
    getDeclFieldsIncludingBase(B.class, fields); 
    for(Field f : fields) { 
     System.out.println(f.getName());  
    } 
} 

private void getDeclFieldsIncludingBase(Class<?> cl, List<Field> fields) { 
    Field[] declaredFields = cl.getDeclaredFields(); 
    for(Field f : declaredFields) { 
     fields.add(f); 
    } 
    Class<?> superclass = cl.getSuperclass(); 
    if(! Object.class.equals(superclass)) { 
     getDeclFieldsIncludingBase(superclass, fields); 
    } 
} 

實施例:

public class A { 
    int a; 
} 

public class B extends A { 
    int b; 
} 

輸出應該

b 
a 
相關問題