背景:有时候想不通阿帕奇的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 支持的属性、事件和方法的知识提供了一个标准方法。