我被困在將Java Bean
轉換爲Map
。互聯網上有很多資源,但不幸的是,他們都把簡單的豆轉換爲地圖。我的一些更廣泛。將Java Bean拼合成地圖
有簡單的例子:
public class MyBean {
private String firstName;
private String lastName;
private MyHomeAddress homeAddress;
private int age;
// getters & setters
}
我的觀點是產生Map<String, Object>
,在這種情況下,對於下列情況屬實:
map.containsKey("firstName")
map.containsKey("lastName")
map.containsKey("homeAddress.street") // street is String
map.containsKey("homeAddress.number") // number is int
map.containsKey("homeAddress.city") // city is String
map.containsKey("homeAddress.zipcode") // zipcode is String
map.containsKey("age")
我曾嘗試使用Apache Commons BeanUtils
。兩種方法BeanUtils#describe(Object)
和BeanMap(Object)
都會產生一個「深度」爲1的映射(我的意思是隻有"homeAddress"
鍵,將MyHomeAddress
對象作爲值)。我的方法應該更深入地輸入對象,直到遇到原始類型(或字符串),然後它應該停止挖掘並插入密鑰,即"order.customer.contactInfo.home"
。
所以,我的問題是:如何輕鬆完成(或者是否有已經存在的項目可以讓我這麼做)?
更新
我已經擴大Radiodef答案也包括集合,映射數組和枚舉:
private static boolean isValue(Object value) {
final Class<?> clazz = value.getClass();
if (value == null ||
valueClasses.contains(clazz) ||
Collection.class.isAssignableFrom(clazz) ||
Map.class.isAssignableFrom(clazz) ||
value.getClass().isArray() ||
value.getClass().isEnum()) {
return true;
}
return false;
}
您可能並不是指「原始」,因爲「字符串」不是原語(它擴展了「對象」)。所以你需要一種方法來告訴算法哪些類需要通過,哪些需要作爲值,所以如果沒有某種配置(可能使用註釋),可能不會有這樣的方法。 – Tonio 2014-09-02 17:10:10
這可以通過反射和遞歸來完成,你幾乎肯定必須自己編寫它。請注意,此時此問題將會關閉,因爲要求提供圖書館建議的內容不屬於主題。 – Radiodef 2014-09-02 19:52:48
Tonio,Radiodef - 感謝您的建議,我編輯了我的文章。 – 2014-09-02 20:13:41