在实际开发过程中,经常碰到需要进行对象与map之间互转的问题,其实对于对象、Map 之间进行互转有很多种方式,下面我们一起来梳理一下:

  • 利用 JSON 工具包,将对象转成字符串,之后再转成 Map,这种需要转换2次,相对来说效率比较底;
  • 利用 Java 反射,获取 Bean 类的属性和值,再转换到 Map 对应的键值对中,相对来说这种方法效率高些,在实现上比较麻烦;
  • 利用 Java 的内省(Introspector) 实现,获取 Bean 类的属性和值,Map与对象互转,效率比较高;
  • 利用 apache 中的 BeanUtils工具包进行操作,底层实现类似方法三;

二、常用方法

也不多说了,直接show code,为了更接近实际场景,我们新建两个实体类UserRole,假设一个用户有多个角色,如下:

publicclass User {private String userId;private String userName;private List<Role> roleList;//... 省略 setter 和 getterpublic User() {}public User(String userId, String userName) {this.userId = userId;this.userName = userName;}
}
publicclass Role {private String userId;private String roleName;//... 省略 setter 和 getterpublic Role(String userId, String roleName) {this.userId = userId;this.roleName = roleName;}
}

2.1、通过 JSON 进行转换

在这里,我们利用阿里巴巴的fastjson包进行转换,通过maven引入 jar,如下:

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.49</version>
</dependency>
方法如下:
publicclass BeanMapUtilByJson {/*** 对象转Map* @param object* @return*/public static Map beanToMap(Object object){return JSONObject.parseObject(JSON.toJSONString(object),Map.class);}/*** map转对象* @param map* @param beanClass* @param <T>* @return*/publicstatic <T> T mapToBean(Map map, Class<T> beanClass){return JSONObject.parseObject(JSON.toJSONString(map),beanClass);}
}

2.2、利用反射进行转换

这种操作是利用 java 原生提供的反射特性来实现互转,方法如下:

publicclass BeanMapUtilByReflect {/*** 对象转Map* @param object* @return* @throws IllegalAccessException*/public static Map beanToMap(Object object) throws IllegalAccessException {Map<String, Object> map = new HashMap<String, Object>();Field[] fields = object.getClass().getDeclaredFields();for (Field field : fields) {field.setAccessible(true);map.put(field.getName(), field.get(object));}return map;}/*** map转对象* @param map* @param beanClass* @param <T>* @return* @throws Exception*/publicstatic <T> T mapToBean(Map map, Class<T> beanClass) throws Exception {T object = beanClass.newInstance();Field[] fields = object.getClass().getDeclaredFields();for (Field field : fields) {int mod = field.getModifiers();if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {continue;}field.setAccessible(true);if (map.containsKey(field.getName())) {field.set(object, map.get(field.getName()));}}return object;}
}

2.3、利用内省机制进行转换

内省(Introspector)是 Java 语言对 JavaBean 类属性、事件的一种缺省处理方法,也是基于 java 原生实现,操作如下:

2.4、利用 apache 中的 BeanUtils 进行转换

在使用这个方法前,需要手动引入 apache 中的 beanutils 包,方法如下:

<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.3</version>
</dependency>

想必大家都不会陌生,操作如下:

publicclass BeanMapUtilByApache {/** * 对象转Map * @param object * @return
*/
public static Map beanToMap(Object object){
return new org.apache.commons.beanutils.BeanMap(object); }
/** * map转对象 * @param map * @param beanClass * @param <T> * @return
*/
publicstatic <T> T mapToBean(Map map, Class<T> beanClass) throws Exception { T object = beanClass.newInstance(); org.apache.commons.beanutils.BeanUtils.populate(object, map);
return object;}
}

2.5、利用 cglib 中的 BeanMap 进行转换

在使用这个方法前,需要手动引入cglib 包,方法如下:

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
</dependency>

Spring 内置了 cglib,在项目中经常看到有同学用这个方法,操作如下:

publicclass BeanMapUtilByCglib {/*** 对象转Map* @param object* @return*/public static Map beanToMap(Object object){Map<String, Object> map = new HashMap<String, Object>();if (object != null) {BeanMap beanMap = BeanMap.create(object);for (Object key : beanMap.keySet()) {map.put(key+"", beanMap.get(key));}}return map;}/*** map转对象* @param map* @param beanClass* @param <T>* @return* @throws Exception*/publicstatic <T> T mapToBean(Map map, Class<T> beanClass) throws Exception {T bean = beanClass.newInstance();BeanMap beanMap = BeanMap.create(bean);beanMap.putAll(map);return bean;}
}

2.6、测试

上面介绍完了操作,最后我们来测试一下,新建一个测试客户端TestClient,分别测试上面5个工具类

publicclass BeanMapClient {/*** 测试* @param args*/public static void main(String[] args) {//为了更贴近实际场景,构造嵌套实体对象User user = new User("1","张三");List<Role> roleList = new ArrayList<Role>();roleList.add(new Role("1","技术经理"));roleList.add(new Role("1","信息主任"));user.setRoleList(roleList);//bean转mapMap userMap = BeanMapUtilByJson.beanToMap(user);System.out.println("转换后的map:" + JSON.toJSONString(userMap));//修改源对象中信息user.getRoleList().get(0).setRoleName("项目经理");user.getRoleList().add(new Role("1","项目经理"));//map转beanUser newUser = BeanMapUtilByJson.mapToBean(userMap,User.class);System.out.println("转换后的bean:" + JSON.toJSONString(newUser));}
}

输出结果如下:

对上面5中输出结果进行分析,可以得出如下结论:

  • 将对象转换成map,基本都一致,将map转成bean的时候,有些小区别;
  • 方法一,通过json转换后的bean对象,即使源对象发生改变,转换后的对象不会发生变化,这是因为json在底层转换bean时,都创建了新的对象;
  • 方法二、三、四、五,当源对象有嵌套对象,修改嵌套对象,也就是Role内容,转换后的对象也会随之发生改变;

从结果可以看出,方法一、二、三、四、五,都可以进行对象与 map 的互转,那他们到底有啥区别呢?

下面我们从性能角度来观察一下,使用for循环测试 map 与对象的互转,结果如下:

可能每个机器的性能不一样,这个是我的电脑上测试的结果,从数据上可以看出:

  • 性能最好的是反射方法,其次就是内省方法,这两个方法都没有引用第三方jar包,所以相对可能要快点;
  • 使用第三方引用中,cglib 效率还可以,其次 apache的beanUtils工具包,最后就是Json包;

总结

如果对性能要求很高,可以采用 java 原生编程实现对象与 map 的互转,如果已经引用了 apache 或者 cglib 的jar,可以利用它提供的方法进行转换,优先推荐使用 cglib,因为 Spring 已经继承了 cglib,在项目中可以直接使用!

JavaBean与Map互转相关推荐

  1. javabean与map的转换

    2019独角兽企业重金招聘Python工程师标准>>> javabean与map的转换有很多种方式,比如: 1.通过ObjectMapper先将bean转换为json,再将json转 ...

  2. jsonArray:JavaBean,List,Map转成json格式(轉+整理)

    JSON与JAVA数据的转换 JavaBean,List,Map转成json格式 JS解析json数据(如何将json字符串转化为数组) 需要四個包: commons-beanutils-1.8.3. ...

  3. go 中 结构体 map互转

    go中用gorm查询的时候往往会用到结构体来定义返回的列表   但是有时候需要拓展字段返回的时候就会觉得很麻烦了  研究了下发现通过转json可以实现结构体和map的互转 代码如下 // 结构体转ma ...

  4. javaBean与Map之间的转换工具

    前言 在日常我们的工作中,很多时候都会将我们的bean转换成Map做一些数据操作,对于这些我们可以写成一个工具类中,以下是我在工作中的bean和Map互转的工具,分享一下,可以直接拷贝过去使用的呦. ...

  5. javaBean List Map json(转)

    1.依赖的包 根据:http://json-lib.sourceforge.net/ 可见json-lib使用需要依赖一下包: 下载地址:http://download.csdn.net/downlo ...

  6. Java实现xml与map互转

    此文档中包含单层和多层嵌套情况下,xml和map集合进行互转,具体代码如下: import java.util.HashMap; import java.util.List; import java. ...

  7. JavaBean与Map相互转换

    为什么80%的码农都做不了架构师?>>>    package com.tzj.utils;import java.beans.BeanInfo; import java.beans ...

  8. 微信支付中xml和map互转

    现在用java做微信公众号的支付,支付过程将参数发给微信是以xml格式发送,接受过来的也是xml格式字符串.感觉网上的xml和map转化复杂就手写了一个,具体代码如下: package com.cij ...

  9. JavaBean,List,Map转成json格式

    Java代码   public class User { private String username; private String password; public String getUser ...

最新文章

  1. 我的Pandas学习经历及动手实践
  2. 转:ASP自动解压RAR文件
  3. OpenCV提供的各种阈值选项的实例(附完整代码)
  4. java shiro做页面显示_Java-Shiro(八):Shiro集成SpringMvc、Themeleaf,如何实现Themeleaf视图引擎下解析*.html中shiro权限验证...
  5. 怀旧服大脚插件未能从服务器,《魔兽世界怀旧服》大脚插件 安装方法使用教程...
  6. mybatis 关联查询 延迟加载
  7. Linux 用户(useradd/userdel/groupadd/groupmod
  8. 信息检索:“众筹”专利分析
  9. c语言中 程序各步作用,c程序的上机执行过程_上机运行C程序的步骤与方法
  10. 【洛谷P4706】取石子
  11. 模版,自定义按钮背景xml
  12. 在linux本地下载ftp中的文件
  13. QMH、AMC和STM之间的关系
  14. errorC1083 无法打开源文件 c1xx
  15. Linux内核配置文件
  16. Vulkan_Shader_Day06—光照(多光源_Multiple lights)
  17. 【评测】】Lonza双胶囊、微粒剂型产品
  18. 保研夏令营-南大、哈工、天大、中山、北理
  19. java电影院购票系统总结_Java实现电影院订票系统代码
  20. java jode_Java中joda日期格式化工具的使用示例

热门文章

  1. 工作小笔记——使用Cartographer建图和调优
  2. 讲了这么多年的CPU频率,到底是什么?
  3. 竞价推广方案怎么写,这些点你get到了吗?
  4. 电大计算机网考试题,电大计算机应用基础网考统考试题及答案
  5. 健身类小程序前后端源码
  6. 用这9个问题来审视自己
  7. 物理隔离网闸——入门篇(2)
  8. 关于Matplotlib实验中出现NameError: name ‘rgb2gray‘ is not defined的解决
  9. 幸福的感觉和感觉的幸福
  10. Excel-图例文本如何修改