2012-11-08 144 views
2

我是新來的反射,並試圖創建一個廣義函數,它將接受對象並解析所有類型爲String,String[]List<String>的字段。任何存在於嵌套對象中的String,String[]List<String>也必須被解析。有沒有可以幫助我做到這一點的工具?從父對象獲取值(User)非常簡單 - 使用BeanUtils.describe(user); - 它在父對象中給出String值,但不給出String[],List<String>和嵌套對象。我相信我可能不是第一個需要這個功能的人?是否有任何實用程序或代碼可以幫助我實現這一目標?Java反射 - 獲取對象中的嵌套對象,列表和數組的值

public class User { 
    private String somevalue; 
    private String[] thisArray; 
    private List<String> thisList; 
    private UserDefinedObject myObject; 
    . 
    . 
    . 

} 
+1

「我確定我可能不是第一個需要此功能的人嗎?」 ...我確信我不是第一個問你是否真的需要這個功能的人。 「因此,人們經常使用反思去做**,而不應該反思性地做。 –

回答

2

方法Class.getDeclaredFields將讓你代表類的每個字段Field秒的陣列。您可以遍歷這些並檢查Field.getType返回的類型。將List類型的字段過濾爲List<String>會更棘手 - 請參閱this post獲取幫助。

完成所需字段的第一個動態查找後,應該跟蹤(記憶)相關的Field對象以獲得更好的性能。

這裏有一個簡單的例子:

//for each field declared in User, 
for (Field field : User.class.getDeclaredFields()) { 
    //get the static type of the field 
    Class<?> fieldType = field.getType(); 
    //if it's String, 
    if (fieldType == String.class) { 
     // save/use field 
    } 
    //if it's String[], 
    else if (fieldType == String[].class) { 
     // save/use field 
    } 
    //if it's List or a subtype of List, 
    else if (List.class.isAssignableFrom(fieldType)) { 
     //get the type as generic 
     ParameterizedType fieldGenericType = 
       (ParameterizedType)field.getGenericType(); 
     //get it's first type parameter 
     Class<?> fieldTypeParameterType = 
       (Class<?>)fieldGenericType.getActualTypeArguments()[0]; 
     //if the type parameter is String, 
     if (fieldTypeParameterType == String.class) { 
      // save/use field 
     } 
    } 
} 

請注意,我用的參考平等(==),而不是isAssignableFrom匹配String.classString[].class因爲Stringfinal

編輯:只是注意到你的一點關於尋找嵌套​​s。您可以將遞歸應用於上述策略以搜索這些策略。