1

我想用Java製作一個GUI,用戶可以在其中選擇一個bean,編輯其字段,然後將創建的bean的實例添加到隊列中。我的問題是關於訪問字段。我有一個從MyParentObject繼承的類MyCompositeObject。 MyParentObject由多個bean組成,每個bean由更多的bean組成。 MyCompositeObject類也由bean組成。我想從MyCompositeObject中找到所有可訪問的字段。如何查找包含在java bean中的所有成員變量的字段

Class MyParentObject 
{ 
    MyObjectOne fieldOne; 
    MyObjectTwo fieldTwo; 
    String name; 
    ... 
} 

Class MyCompositeObject extends MyParentObject 
{ 
    MyObjectThree fieldThree; 
    Integer number; 
    ... 
} 

Class MyObjectThree 
{ 
    boolean aBoolean; 
    MyObjectFour fieldFour; 
    ... 
} 

我一直在試圖使用的BeanUtils API,但我陷入試圖讓所有的成員豆的領域。我想象的是對MyCompositeObject的一個實例可以訪問的所有字段進行深度優先搜索。例如,這將包括但不限於以下字段:MyCompositeObject.fieldOne,MyCompositeObject.number,MyCompositeObject.fieldThree.aBoolean。

我意識到,當我嘗試:

Fields[] allFields = BeanUtils.getFields(myCompositeObject); 

,我是在我的頭上。迄今爲止,我的研究還沒有發現任何可以完成我所描述的預建方法。請讓我知道任何可以做到這一點的API方法或告訴我如何構建我自己的方法。謝謝。

回答

2

這是一種痛苦,但你必須在兩個維度

yourBeanClass.getSuperclass(); (and recursively get all superclasses until Object) 

,然後你可以得到的每一個

eachClass.getDeclaredFields() NOT getFields so you can get all the private fields 

領域一旦有了每個字段去

field.getType() which returns the Class of that field 

那麼當然,你需要再次上去那個帥哥超級鏈,以確保你得到所有的領域包括超類中的類

一旦你有該領域的類鏈,然後你可以通過重複上述....來獲得它的領域....是的,jdk使這個有趣!我希望他們有一個getAllDeclaredFields方法,所以我不必去超級階梯。

重要提示:您需要調用field.setAccessible(true),以便您可以在私人字段中讀取和寫入信息!

這裏是代碼,獲取所有字段包括超一類..

private static List<Field> findAllFields(Class<?> metaClass) { 
    List<Field[]> fields = new ArrayList<Field[]>(); 
    findFields(metaClass, fields); 

    List<Field> allFields = new ArrayList<Field>(); 
    for(Field[] f : fields) { 
     List<Field> asList = Arrays.asList(f); 
     allFields.addAll(asList); 
    } 
    return allFields; 
} 

private static void findFields(Class metaClass2, List<Field[]> fields) { 
    Class next = metaClass2; 
    while(true) { 
     Field[] f = next.getDeclaredFields(); 
     fields.add(f); 
     next = next.getSuperclass(); 
     if(next.equals(Object.class)) 
      return; 
    } 
} 

後, 院長

+0

感謝。這使我獲得最大的方式。仍然需要考慮獲取所有領域的遞歸。 – 2012-10-01 12:43:18

相關問題