2012-11-19 27 views
1

我使用此代碼獲取與對象關聯的所有字段。有問題的對象有三個超類,其他類從這個對象擴展。Java - 從反射中排除超類字段

for (Field f : this.getClass().getFields()){ 
    try{ 
     fieldName = f.getName(); 
     fieldType = f.getType().toString(); 
     //Do more stuf 
    } 

我不希望得到與超類相關的領域,但我想在目前的類和所有領域的所有那些可能從其擴展。

如何過濾掉哪些字段是我需要的字段?

回答

3

對於每個Field可以使用getDeclaringClass()確定聲明的字段的類,所以如果你有一個像

A 
| 
B 
| 
C 
|\ 
D E 

一個層次,你想在CDE聲明僅領域,那麼你就可以說

for (Field f : this.getClass().getFields()){ 
    if(C.class.isAssignableFrom(f.getDeclaringClass())) { 
    // f was declared by C or one of its subclasses 

如果this是,你會得到公正的C公共領域的C實例,如果thisD,那麼您將獲得公共字段CD,如果thisAB,那麼您將不會收到任何字段。

+0

正是我需要的。 – WildBamaBoy

4

我不想獲取與超類關聯的字段,但我希望當前類中的所有字段以及所有可能從其中擴展的字段。

你不能讓「所有那些可能從其擴展」 - 但如果你使用Class.getDeclaredFields(),而不是getFields(),那麼你就只能得到在類中聲明的領域。