实例类:
package wsy.bean2map;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Setter
@Getter
@ToString
public class Person {
private String name;
private int age;
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
实现与测试
package wsy.bean2map;
import org.apache.commons.beanutils.BeanUtils;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
public class Bean2Map {
/**
* 反射实现转换
* @param obj
* @return
*/
public static Map<String, Object> bean2MapByReflect(Object obj)
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Map<String, Object> map = new HashMap<>();
Field[] declaredFields = obj.getClass().getDeclaredFields();
for (Field field : declaredFields) {
String methodName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
map.put(field.getName(), obj.getClass().getDeclaredMethod(methodName).invoke(obj));
}
return map;
}
/**
*
* @param obj
* @return
*/
public static Map<String, Object> bean2Map(Object obj)
throws IntrospectionException, InvocationTargetException, IllegalAccessException {
Map<String, Object> map = new HashMap<>();
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass(), Object.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor p : propertyDescriptors) {
String key = p.getName();
Object value = p.getReadMethod().invoke(obj);
map.put(key, value);
}
return map;
}
/**
*
* @param map
* @param classType
* @param <T>
*/
public static <T> T map2Bean(Map<String, Object> map, Class<T> classType)
throws IntrospectionException, IllegalAccessException, InstantiationException, InvocationTargetException {
// 创建对象
T obj = classType.newInstance();
// 获取对象的字节码信息
BeanInfo beanInfo = Introspector.getBeanInfo(classType, Object.class);
// 获取bean对象中的所有属性
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor P : propertyDescriptors) {
String key = P.getName();
Object value = map.get(key);
P.getWriteMethod().invoke(obj, value); // 设置属性值
}
return obj;
}
/**
* 反射实现map转bean
* @param map
* @param classType
* @param <T>
* @return
*/
public static <T> T map2BeanByReflect(Map<String, Object> map, Class<T> classType)
throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
T obj = classType.newInstance();
Field[] declaredFields = classType.getDeclaredFields();
for (Field field : declaredFields) {
Object value = map.get(field.getName());
String methodName = "set" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
classType.getDeclaredMethod(methodName, field.getType()).invoke(obj, value);
}
return obj;
}
public static void main(String[] args)
throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, IntrospectionException,
InstantiationException {
Person person = new Person("jack", 18);
System.out.println(bean2Map(person));
System.out.println(bean2MapByReflect(person));
System.out.println("======================");
Map<String, Object> map = new HashMap<>();
map.put("name", "Tom");
map.put("age", 18);
System.out.println(map2Bean(map, Person.class).toString());
System.out.println(map2BeanByReflect(map, Person.class));
System.out.println("========================");
// 引入apache封装的BeanUtils
// bean转map
Map<String, String> describe = BeanUtils.describe(person);
System.out.println(describe);
// map 转bean
Person person1 = new Person();
BeanUtils.copyProperties(person1, map);
System.out.println(person1);
}
}
测试结果
{name=jack, age=18}
{name=jack, age=18}
======================
Person(name=Tom, age=18)
Person(name=Tom, age=18)
========================
{name=jack, age=18}
Person(name=Tom, age=18)
BeanUtils依赖:
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
依赖参考:
http://commons.apache.org/beanutils/
注意:应用的时候还需要一个logging包 http://commons.apache.org/logging/