利用springcore的org.springframework.cglib.beans.BeanMap
这个方法转出来的Map再一次进行put是put不了内容的,需要新new Map().putAll(这个Map)
这里的实体类必需实现get/set方法,不然读不到属性
beanToMap
public static <T> Map<String, ?> beanToMap(T bean) {
BeanMap beanMap = BeanMap.create(bean);
Map<String, Object> map = new HashMap<>();
beanMap.forEach((key, value) -> {
map.put(String.valueOf(key), value);
});
return map;
}
mapToBean
beanMap 一旦创建出来,后面的值就无法修改了,不管是新增还是修改,而且修改的时候还容易出问题,适合单纯的直接转一下,中间不做任务修改
public void mapToBean(){
ObjectMapper mapper = new ObjectMapper();
Map map = new HashMap();
map.put("name","12");
C bean = null;
BeanMap beanMap = null;
try {
bean = C.class.newInstance();
beanMap = BeanMap.create(bean);
beanMap.putAll(map);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
System.out.println(bean);
}
接下来是apache的commons-beanutils
先上maven依赖
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
使用简单,一把梭,不过也是需要get/set
方法才能读取到属性的
不过这里有个隐藏坑,这里 BeanUtils.describe 返回的 Map 是 final 的就是不能变的
而且读取出来的Map的value都是String的不管之前javaBean的Type是啥
public void testBeanToMapApache(){
try {
System.out.println(BeanUtils.describe(new C()));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
apache的commons-beanutils的mapToBean
public void testMapToBeanApache(){
Map map = new HashMap();
map.put("name","12");
C bean = null;
try {
bean = C.class.newInstance();
BeanUtils.populate(bean,map);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
apache的org.apache.commons.beanutils.PropertyUtils.describe还是这个香(推荐)
beanToMap
这个工具类转出来的Map
的value
是没有做处理的,原来是啥类型还是啥类型
不过它返回的也是一个final
的Map
public void testBeanToMapApache(){
try {
System.out.println(PropertyUtils.describe(new C()));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
使用反射手写BeanToMap
public void test() throws IllegalAccessException {
C c = new C();
Map<String, Object> map = new HashMap<String, Object>();
//Class cls = obj.getClass();
Class cls = C.class;
import java.lang.reflect.Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
//当isAccessible()的结果是false时不允许通过反射访问该字段
//当该字段时private修饰时isAccessible()得到的值是false,必须要改成true才可以访问
//setAccessible(true);得作用就是让我们在用反射时访问私有变量
field.setAccessible(true);
map.put(field.getName(), field.get(c));
}
System.out.println(map);
}
反射mapToBean
public void test() throws InstantiationException, NoSuchFieldException, IllegalAccessException {
Map<String,Object> map = new HashMap();
map.put("name","12");
Object object = C.class.newInstance();
for (String key : map.keySet()){
Field temFiels = C.class.getDeclaredField(key);
temFiels.setAccessible(true);
temFiels.set(object, map.get(key));
}
System.out.println(object);
}