背景:有時候想不通阿帕奇的BeanUtils是怎么進行map和Bean互相轉化的。
工作閑暇之余,自己寫個一小段代碼,一探究竟,試試才發現,原來一切並非我們想的那么什么和復雜。
注:這里只是簡單實例,不追求嚴密的代碼規范和異常處理。
首先,新建一個工具類BeanUtils.java.
輔助實體類Person.java,如下:
public class Person { private String name; private int age; private boolean adult; public Person(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.adult = isAdult; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", adult=" + adult + "]"; } public Person() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; } }
1.JavaBean 轉換為Map<String,Object>;
//bean 轉化為map public static Map<String,Object> tranferBean2Map(Object obj) throws Exception{ //obj為空,結束方法 if(obj==null) return null; Map<String, Object> map=new HashMap<String, Object>(); /*Introspector 類為通過工具學習有關受目標 Java Bean 支持的屬性、事件和方法的知識提供了一個標准方法。 * java的自省機制 * */ BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); PropertyDescriptor[] ps = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor propertyDescriptor : ps) { String key = propertyDescriptor.getName(); if(!"class".equals(key)){ Method getter = propertyDescriptor.getReadMethod(); Object value = getter.invoke(obj); map.put(key, value); } } return map; }
2.Map<String,Object>轉換為JavaBean ,使用簡單的泛型;
//map轉換為javaBean public static <T extends Object> T transferMap2Bean(Map<String,Object> map,Class<T> clazz) throws Exception{ T instance = clazz.newInstance(); BeanInfo beanInfo = Introspector.getBeanInfo(clazz); PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor property : descriptors) { String key=property.getName(); if(map.containsKey(key)){ Object value = map.get(key); Method setter = property.getWriteMethod(); setter.invoke(instance, value); } } return instance; }
經過測試,可以成功進行map和javabean的互轉。
Introspector 類為通過工具學習有關受目標 Java Bean 支持的屬性、事件和方法的知識提供了一個標准方法。