javaBean与Map<String,Object>互转

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

原文地址:https://www.cnblogs.com/sloveling/p/map2bean.html