javabean对象和map互相转换

知兮丶青 工具类 · 反射
阅读(1441) 2018-01-06
javabean对象和map互相转换
javabean对象和map互相转换

介绍一个 JavaBean转Map 和 Map转JavaBean 的工具类。


UserBean.java。定义java bean类

package com.weizhixi.test;

public class UserBean {
    private Integer id;
    private String name;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}


MapUtil.java,Map工具类

package com.weizhixi.test;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * Map Bean转换工具
 * Created by cxq on 2018/1/5.
 */
public class MapUtil {

    /**
     * Map转换成JavaBean.
     * @param type JavaBean的Class
     * @param map map
     * @return 转换的JavaBean
     * @throws IntrospectionException 无法获取类字段
     * @throws IllegalAccessException JavaBean无法被实例化
     * @throws InstantiationException JavaBean无法被实例化
     * @throws InvocationTargetException 调用方法失败
     */
    public static final Object toBean(Class<?> type, Map<String, ? extends Object> map) throws IntrospectionException, IllegalAccessException,  InstantiationException, InvocationTargetException {
        //获取JavaBean其所有属性、公开的方法和事件
        BeanInfo beanInfo = Introspector.getBeanInfo(type);
        //实例化JavaBean对象
        Object obj = type.newInstance();
        //获取属性数组
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (int i = 0; i< propertyDescriptors.length; i++) {
            //取出一个属性
            PropertyDescriptor descriptor = propertyDescriptors[i];
            //获取属性名称
            String propertyName = descriptor.getName();
            //判断属性是否存在于map
            if (map.containsKey(propertyName)) {
                //获取属性对应值
                Object value = map.get(propertyName);
                Object[] args = new Object[1];
                args[0] = value;
                //把值设置到当前属性
                descriptor.getWriteMethod().invoke(obj, args);
            }
        }
        return obj;
    }

    /**
     * JavaBean转换成Map
     * @param bean JavaBean类
     * @return map对象
     * @throws IntrospectionException 无法获取类字段
     * @throws IllegalAccessException JavaBean无法被实例化
     * @throws InvocationTargetException 调用方法失败
     */
    public static final Map<String, Object> toMap(Object bean) throws IntrospectionException, IllegalAccessException, InvocationTargetException {
        //定义Map对象
        Map<String, Object> returnMap = new HashMap<String, Object>();
        //获取JavaBean其所有属性、公开的方法和事件
        BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass());
        //获取属性数组
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (int i = 0; i< propertyDescriptors.length; i++) {
            //取出一个属性
            PropertyDescriptor descriptor = propertyDescriptors[i];
            //获取属性名称
            String propertyName = descriptor.getName();
            //过滤class
            if (!propertyName.equals("class")) {
                //获取属性方法,用于读取属性值的方法
                Method readMethod = descriptor.getReadMethod();
                //调用方法返回当前属性值
                Object result = readMethod.invoke(bean, new Object[0]);
                if (result != null) {
                    //将属性名称和属性对应值放入map
                    returnMap.put(propertyName, result);
                } else {
                    //如果无值,默认为空字符串
                    returnMap.put(propertyName, "");
                }
            }
        }
        return returnMap;
    }

}


调用示例:

public static void main(String[] args) throws Exception{

    Map<String,Object> objectMap = new HashMap<String, Object>();
    objectMap.put("id",1);
    objectMap.put("name","张三");

    //Map转JavaBean
    UserBean userBean = (UserBean)toBean(UserBean.class, objectMap);
    System.out.println(userBean.getId());
    System.out.println(userBean.getName());
    //1
    //张三

    //JavaBean转Map
    System.out.println(toMap(userBean));
    //{id=1, name=张三}

}


相关介绍:

IntrospectionException 

无法将字符串类名称映射到 Class 对象、无法解析字符串方法名,或者指定对其用途而言具有错误类型签名的方法名称。 


IllegalAccessException

当应用程序试图反射性地创建一个实例(而不是数组)、设置或获取一个字段,或者调用一个方法,但当前正在执行的方法无法访问指定类、字段、方法或构造方法的定义时,抛出抛出该异常。


InstantiationException

当应用程序试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常。实例化失败有很多原因,包括但不仅限于以下原因:

1、类对象表示一个抽象类、接口、数组类、基本类型、void

2、类没有非 null 构造方法 


InvocationTargetException

调用方法或构造方法所抛出异常的经过检查的异常。




原创文章,转载请注明出处:https://www.weizhixi.com/article/51.html