JavaBean与Map互转
在实际开发过程中,经常碰到需要进行对象与map之间互转的问题,其实对于对象、Map 之间进行互转有很多种方式,下面我们一起来梳理一下:
- 利用 JSON 工具包,将对象转成字符串,之后再转成 Map,这种需要转换2次,相对来说效率比较底;
- 利用 Java 反射,获取 Bean 类的属性和值,再转换到 Map 对应的键值对中,相对来说这种方法效率高些,在实现上比较麻烦;
- 利用 Java 的内省(Introspector) 实现,获取 Bean 类的属性和值,Map与对象互转,效率比较高;
- 利用 apache 中的
BeanUtils
工具包进行操作,底层实现类似方法三;
二、常用方法
也不多说了,直接show code
,为了更接近实际场景,我们新建两个实体类User
、Role
,假设一个用户有多个角色,如下:
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互转相关推荐
- javabean与map的转换
2019独角兽企业重金招聘Python工程师标准>>> javabean与map的转换有很多种方式,比如: 1.通过ObjectMapper先将bean转换为json,再将json转 ...
- jsonArray:JavaBean,List,Map转成json格式(轉+整理)
JSON与JAVA数据的转换 JavaBean,List,Map转成json格式 JS解析json数据(如何将json字符串转化为数组) 需要四個包: commons-beanutils-1.8.3. ...
- go 中 结构体 map互转
go中用gorm查询的时候往往会用到结构体来定义返回的列表 但是有时候需要拓展字段返回的时候就会觉得很麻烦了 研究了下发现通过转json可以实现结构体和map的互转 代码如下 // 结构体转ma ...
- javaBean与Map之间的转换工具
前言 在日常我们的工作中,很多时候都会将我们的bean转换成Map做一些数据操作,对于这些我们可以写成一个工具类中,以下是我在工作中的bean和Map互转的工具,分享一下,可以直接拷贝过去使用的呦. ...
- javaBean List Map json(转)
1.依赖的包 根据:http://json-lib.sourceforge.net/ 可见json-lib使用需要依赖一下包: 下载地址:http://download.csdn.net/downlo ...
- Java实现xml与map互转
此文档中包含单层和多层嵌套情况下,xml和map集合进行互转,具体代码如下: import java.util.HashMap; import java.util.List; import java. ...
- JavaBean与Map相互转换
为什么80%的码农都做不了架构师?>>> package com.tzj.utils;import java.beans.BeanInfo; import java.beans ...
- 微信支付中xml和map互转
现在用java做微信公众号的支付,支付过程将参数发给微信是以xml格式发送,接受过来的也是xml格式字符串.感觉网上的xml和map转化复杂就手写了一个,具体代码如下: package com.cij ...
- JavaBean,List,Map转成json格式
Java代码 public class User { private String username; private String password; public String getUser ...
最新文章
- 我的Pandas学习经历及动手实践
- 转:ASP自动解压RAR文件
- OpenCV提供的各种阈值选项的实例(附完整代码)
- java shiro做页面显示_Java-Shiro(八):Shiro集成SpringMvc、Themeleaf,如何实现Themeleaf视图引擎下解析*.html中shiro权限验证...
- 怀旧服大脚插件未能从服务器,《魔兽世界怀旧服》大脚插件 安装方法使用教程...
- mybatis 关联查询 延迟加载
- Linux 用户(useradd/userdel/groupadd/groupmod
- 信息检索:“众筹”专利分析
- c语言中 程序各步作用,c程序的上机执行过程_上机运行C程序的步骤与方法
- 【洛谷P4706】取石子
- 模版,自定义按钮背景xml
- 在linux本地下载ftp中的文件
- QMH、AMC和STM之间的关系
- errorC1083 无法打开源文件 c1xx
- Linux内核配置文件
- Vulkan_Shader_Day06—光照(多光源_Multiple lights)
- 【评测】】Lonza双胶囊、微粒剂型产品
- 保研夏令营-南大、哈工、天大、中山、北理
- java电影院购票系统总结_Java实现电影院订票系统代码
- java jode_Java中joda日期格式化工具的使用示例