如何利用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!
相关文章
|
3月前
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第17天】本文详细介绍了Java编程中Map的使用,涵盖Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的并发处理和性能优化技巧,适合初学者和进阶者学习。
99 3
|
3月前
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
131 3
|
3月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
96 2
|
3月前
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
105 2
|
3月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
104 2
|
3月前
|
存储 缓存 安全
HashMap VS TreeMap:谁才是Java Map界的王者?
HashMap VS TreeMap:谁才是Java Map界的王者?
158 2
|
3月前
|
存储 Java API
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
键值对魔法:如何优雅地使用Java Map,让代码更简洁?
165 2
|
26天前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
2月前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。
|
2月前
|
Java
Java的反射
Java的反射。
43 2

热门文章

最新文章