Java中利用反射进行Map和JavaBean间转换
在日常工作中,有时候我们可能会遇到以下这样的情况发生。
例如:
(1)后端接受一个参数Map param(可能是前端form维护的一个对象...)。
(2)将一个对象个别属性(key)和对应值(value)存放到Map对象中。
(3).......
针对上面情况:
1、对于对象属性较少时还是比较方便操作,可以手动写入解决。
2、如果是属性特别多(几十、甚至上百个字段),用到的地方也特别多时,再手动写的话就有点繁琐。
这里给大家推荐一个方法:
利用反射进行Map和JavaBean间转换
案例:
(1)下面是一个比较常见JavaBean。
以Student为例,属性、构造器、set/get、toString......
(2) 工具类MapAndJavaBeanUtil
方法:将Map转化为JavaBean
主要利用java反射的机制(此篇不针对反射)。
Field类:封装了对象属性信息。
//获取对象的属性fields数组
Field[] fields = obj.getClass().getDeclaredFields();
//设置对象属性名 属性值
field.set(obj, map.get(field.getName()));
(3) 方法:将Object转化为Map
与(2)同理。
(4) 测试
如果大家还有其他方法欢迎评论留言,共同进步,感谢支持。
源码贴在下面或者大家可以私信留言。
MapAndJavaBeanUtil 工具类
package util;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
public class MapAndJavaBeanUtil {
/**
* 将map转化为JavaBean
* @param map
* @param clazz
* @return
*/
public static Object mapToObject(Map map,Class> clazz) {
if(map == null) return null;
Object obj = null;
try {
obj = clazz.newInstance();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
int mod = field.getModifiers();
if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
continue;
}
field.setAccessible(true);
//设置对象的属性名 属性值
field.set(obj, map.get(field.getName()));
}
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
/**
* 将object转化为map
* @param obj
* @return
*/
public static Map ObjectToMap(Object obj) {
if(obj == null)return null;
Map map = new HashMap<>();
Class clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
try {
for (Field field : fields) {
//破坏封装(private)
field.setAccessible(true);
//属性名 属性值
map.put(field.getName(), field.get(obj));
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
}
Student实体类
package entity;
import java.util.Date;
public class Student {
private String pkid;
private Integer sno;
private String sname;
private Date date;
public Student() {}
public Student(String pkid, Integer sno, String sname, Date date) {
super();
this.pkid = pkid;
this.sno = sno;
this.sname = sname;
this.date = date;
}
public String getPkid() {
return pkid;
}
public void setPkid(String pkid) {
this.pkid = pkid;
}
public Integer getSno() {
return sno;
}
public void setSno(Integer sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "Student [pkid=" + pkid +