如何利用Java中的反射实现Map和JavaBean间转换

简介: Java中利用反射进行Map和JavaBean间转换,在日常工作中,有时候我们可能会遇到以下这样的情况发生。

前言

Java中利用反射进行Map和JavaBean间转换

在日常工作中,有时候我们可能会遇到以下这样的情况发生。

例如:

(1)后端接受一个参数Map<String,Object> 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<String,Object> 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<String,Object> ObjectToMap(Object obj) {
if(obj == null)return null;
Map<String, Object> 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 + ", sno=" + sno + ", sname=" + sname + ", date=" + date + "]";
}
}

Demo测试类

package test;
import java.util.Date;
import java.util.Map;
import entity.Student;
import util.MapAndJavaBeanUtil;
public class Demo1 {
public static void main(String[] args) {
Student stu = new Student();
stu.setPkid("274DA9A4C02D4654870FF5311E5154FF");
stu.setSname("odysee");
stu.setSno(new Integer(20144550));
stu.setDate(new Date());
//student --> map
Map<String,Object> result = MapAndJavaBeanUtil.ObjectToMap(stu);
System.out.println("student --> map:"+result);
//map --> student
Object obj = MapAndJavaBeanUtil.mapToObject(result, Student.class);
Student stuResult = (Student) obj;
System.out.println("map --> student:"+stuResult.toString());
}
}
关注公众号:麒麟改bug,分享Java核心学习笔记,一起学Java!
相关文章
|
23天前
|
Java
学校教师管理系统【JSP+Servlet+JavaBean】(Java课设)
学校教师管理系统【JSP+Servlet+JavaBean】(Java课设)
19 1
|
23天前
|
Java
人事管理系统【JSP+Servlet+JavaBean】(Java课设)
人事管理系统【JSP+Servlet+JavaBean】(Java课设)
18 0
|
1月前
|
网络协议 算法 Java
|
1月前
|
XML Java 数据库连接
谈谈Java反射:从入门到实践,再到原理
谈谈Java反射:从入门到实践,再到原理
60 0
|
1月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
1月前
|
Java 关系型数据库 MySQL
在Java的反射中,Class.forName和ClassLoader的区别
在Java的反射中,Class.forName和ClassLoader的区别
35 3
|
5天前
|
监控 Java 开发者
掌握 Java 反射和动态代理
【4月更文挑战第19天】Java反射和动态代理提供强大功能和灵活性。反射允许运行时检查和操作类,获取类信息、动态调用方法,但可能带来性能损失和降低代码可读性。动态代理则用于创建代理对象,实现透明性和横切关注点分离,常用于日志、权限检查等。两者结合能实现更复杂功能。掌握这些技术能提升代码的灵活性和可扩展性,但也需注意性能和可读性。通过学习和实践,能更好地构建高效软件系统。
|
12天前
|
Java
代码的魔法师:Java反射工厂模式详解
代码的魔法师:Java反射工厂模式详解
26 0
|
12天前
|
存储 算法 安全
Java Map:键值对的奇妙之旅
Java Map:键值对的奇妙之旅
41 0
Java Map:键值对的奇妙之旅
|
16天前
|
安全 Java
java反射篇
java反射篇