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