介绍一个 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 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
//取出一个属性
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 toMap(Object bean) throws IntrospectionException, IllegalAccessException, InvocationTargetException {
//定义Map对象
Map returnMap = new HashMap();
//获取JavaBean其所有属性、公开的方法和事件
BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass());
//获取属性数组
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (int i = 0; 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 objectMap = new HashMap();
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