map与java对象相互转换_java map转对象-程序员宅基地

技术标签: java  map与java对象转换  

最近,研究map与java对象之间的相互转换,总结了5种方法:

第一种:使用org.apache.commons.beanutils转换

用到的主要jar包:commons-beanutils-1.9.3.jar

//map转java对象
public static Object mapToObject(Map<String, Object> map, Class<?> beanClass)
			throws Exception {
		if (map == null) {
			return null;
		}
		Object obj = beanClass.newInstance();
		BeanUtils.populate(obj, map);
		return obj;
	}

//java对象转map
public static Map<?, ?> objectToMap(Object obj) {
		if (obj == null)
			return null;
		return new BeanMap(obj);
	}

在使用该方法进行java对象转map时,可能会发生以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/collections/Transformer
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
	at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
	at org.apache.commons.beanutils.BeanMap.createTypeTransformers(BeanMap.java:132)
	at org.apache.commons.beanutils.BeanMap.<clinit>(BeanMap.java:68)
	at com.example2.pojo.PojoToMap.objectToMap(PojoToMap.java:23)
	at com.example2.pojo.PojoToMap.main(PojoToMap.java:16)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.Transformer
	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
	... 16 more

解决方法见本人的另一篇文章: https://blog.csdn.net/liuyunyihao/article/details/86596595

第二种:使用Introspector转换

//map转java对象
public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {
        if (map == null)
            return null;
        Object obj = beanClass.newInstance();
        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor property : propertyDescriptors) {
            Method setter = property.getWriteMethod();
            if (setter != null) {
                setter.invoke(obj, map.get(property.getName()));
            }
        }
        return obj;
    }

//java对象转map
public static Map<String, Object> objectToMap(Object obj) throws Exception {
	if (obj == null) {
		return null;
	}
	Map<String, Object> map = new HashMap<String, Object>();
	BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
	PropertyDescriptor[] propertyDescriptors = beanInfo
				.getPropertyDescriptors();
	for (PropertyDescriptor property : propertyDescriptors) {
		String key = property.getName();
		if (key.compareToIgnoreCase("class") == 0) {
			continue;
		}
		Method getter = property.getReadMethod();
		Object value = getter != null ? getter.invoke(obj) : null;
		map.put(key, value);
	}
	return map;
}

第三种:使用reflect转换

//map转java对象
public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {
        if (map == null) {
            return null;
        }
        Object object = beanClass.newInstance();
        Field[] fields = beanClass.getDeclaredFields();
        for (Field field : fields) {
            int mod = field.getModifiers();
            if (Modifier.isFinal(mod) || Modifier.isStatic(mod)) {
                continue;
            }
            field.setAccessible(true);
            field.set(object, map.get(field.getName()));
        }
        return object;
    }

//java对象转map
public static Map<String, Object> objectToMap(Object obj) throws Exception {
	if (obj == null) {
		return null;
	}
	Map<String, Object> map = new HashMap<String, Object>();
	Field[] declaredFields = obj.getClass().getDeclaredFields();
	for (Field field : declaredFields) {
		field.setAccessible(true);
		map.put(field.getName(), field.get(obj));
	}
	return map;
}

第四种:使用net.sf.cglib.beans.BeanMap转换

用到的主要jar包:cglib-2.2.2.jar

//map转java对象
public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {
    Object object = beanClass.newInstance();
    BeanMap beanMap = BeanMap.create(object);
    beanMap.putAll(map);
    return object;
}

//java对象转map
public static Map<String, Object> objectToMap(Object obj) {
    Map<String, Object> map = Maps.newHashMap();
    if (obj != null) {
        BeanMap beanMap = BeanMap.create(obj);
        for (Object key : beanMap.keySet()) {
            map.put(key + "", beanMap.get(key));
        }
    }
    return map;
}

在使用本方法进行map转java对象时,可能会发生以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/Type
	at net.sf.cglib.core.TypeUtils.parseType(TypeUtils.java:184)
	at net.sf.cglib.core.KeyFactory.<clinit>(KeyFactory.java:66)
	at net.sf.cglib.beans.BeanMap$Generator.<clinit>(BeanMap.java:64)
	at net.sf.cglib.beans.BeanMap.create(BeanMap.java:56)
	at com.example2.pojo.MapToPojo.mapToBean(MapToPojo.java:27)
	at com.example2.pojo.MapToPojo.main(MapToPojo.java:18)
Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type
	at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
	... 6 more

解决方法见本人的另一篇文章:https://blog.csdn.net/liuyunyihao/article/details/86593722

第五种:使用json转换

用到的主要jar包:fastjson-1.2.54.jar

//map转java对象
public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {
    String jsonStr = JSONObject.toJSONString(map);
    return JSONObject.parseObject(jsonStr, beanClass);
}

//java对象转map
public static Map<String, Object> objectToMap(Object obj) {
    String jsonStr = JSONObject.toJSONString(obj);
    return JSONObject.parseObject(jsonStr);
}

以上方法本人均实际测试通过。

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liuyunyihao/article/details/86597002

智能推荐

C语言中一位数组,二维数组,变长数组的定义_c语言二维指针数组 一维固定,二维变长-程序员宅基地

文章浏览阅读2.3k次。明确概念:C语言不允许单独声明未定义长度的数组。C99中,一位数组的声明(同时赋值)时可以不写数组长度。如 int myarray[]={1,2,3,4,5}; 的原因是,编译器会根据赋值自动给出数组长度。但是,二维数组的声明时必须写上边界。如下的写法unsigned int grades[][] = { {80,81,82,83,8..._c语言二维指针数组 一维固定,二维变长

升级linux内核 /sbin/dracut: line 1215: /proc/crypto: No such file or directory-程序员宅基地

文章浏览阅读474次。背景:centos 内核版本 3.10 。该版本不支持 k8s的使用,需要升级。首先是用yum进行升级,如:https://www.cnblogs.com/xzkzzz/p/9627658.html 所示(或者:https://www.linuxprobe.com/update-kernel-centos7.html)说明: 安装grub2-mkconfig:通过 yum provides grub2-mkconfig 找到对应的包,然后yum install 包以上方法更新失败。尝试本_/sbin/dracut: line 1215: /proc/crypto: no such file or directory

python编程快速上手办公自动化_关于Excel乘法表的解答_multiplicationtable.py-程序员宅基地

文章浏览阅读151次。创建程序multiplicationTable.py,从命令行接受数字N,在一个Excel电子表格中创建一个N×N的乘法表。#! python3# multiplicationTable.py - 实践项目# 引用区import openpyxlimport openpyxl.stylesimport openpyxl.utilsimport sys# 表格前期工作wb = openpyxl.Workbook()sheet = wb.create_sheet()tablesize _multiplicationtable.py

mysql存储过程局部变量使用_MySQL存储过程使用输出变量-程序员宅基地

文章浏览阅读694次。下面给出一个具体例子:在model数据库中创建如下表:DROP TABLE IF EXISTS `model`.`model_director`;CREATE TABLE `model`.`model_director` (`model_id` int(11) NOT NULL,`director_id` int(11) NOT NULL,PRIMARY KEY (`model_id`,`dire..._mysql execute 能用局部变量吗

毕设记录01-2022-0301_毕设数据缓存可以不做吗-程序员宅基地

文章浏览阅读367次。毕设记录011. redis作用:数据库访问压⼒:为了降低对数据库的访问压⼒,当多个⽤户请求相同的数据时,我们可以将第⼀次从数据库查询到数据进⾏缓存(存储在内存中),以减少对数据库的访问次数⾸⻚数据的加载效率:将⼤量的且不经常改变的数据缓存在内容中,可以⼤幅度提⾼访问速度集群部署下的商品超卖:分布式事务⽤户登录:分布式会话2. 向redis中存储数据不同数据结构的添加操作//1.string//添加数据 set key valuestringRedisTemplate.boundVa_毕设数据缓存可以不做吗

java.net.SocketException:Software caused connection abort: recv failed-程序员宅基地

文章浏览阅读7.5k次,点赞2次,收藏3次。今天总是报一个

随便推点

ORB-SLAM2学习笔记——局部BA优化-程序员宅基地

文章浏览阅读2.4k次。ORB-SLAM2学习笔记——局部BA优化1、理论部分(待更新)2、代码详解void Optimizer::LocalBundleAdjustment(KeyFrame *pKF, bool* pbStopFlag, Map* pMap){ // 该优化函数用于LocalMapping线程的局部BA优化 //step 1 : 得到所有局部关键帧 //step 2 : 得到所有地图点 //step 3 : 把关键帧和能看到的地图点对应到一起 //step_局部ba

c3p0-config.xml配置与使用-程序员宅基地

文章浏览阅读1.7w次,点赞7次,收藏11次。C3P0配置与使用一、C3P0配置1、使用xml方式(名称为c3p0-config.xml) jdbc:mysql://localhost:3306/tv_guide com.mysql.jdbc.Driver root root 30000 30 10 30 100 10 200 2、使用properti_c3p0-config.xml配置

Echarts经纬度坐标实现地图定位_echarts 经纬度定位-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏39次。一、Echarts下载echarts官网:http://echarts.apache.org/zh/index.htmlecharts下载 https://echarts.apache.org/zh/download.html我是从github上下载的zip压缩包下载后,解压,然后将dist文件夹中的内容和map文件夹中的文件放在一个文件夹中,引入到项目中二、功能实现项目中的引用页面代码实现页面中添加js引用 注:如果需要世界地图则引用world.js,我.._echarts 经纬度定位

C++ 利用管道操作本机命令行命令_完成一个使用管道命令的实例-程序员宅基地

文章浏览阅读2.4k次,点赞4次,收藏11次。目录1.知识要点1.1 进程创建与关闭1.2 管道的创建与关闭2.利用MFC创建命令行命令执行工具2.1 界面创建2.2 命令执行函数2.3 测试1.知识要点1.1 进程创建与关闭在C++中,创建一个进程,需要利用WINDOWS API函数,该函数的原型如下:BOOL CreateProcessA( LPCSTR ..._完成一个使用管道命令的实例

基于Netty最简单的WebSocket通讯_binarywebsocketframe-程序员宅基地

文章浏览阅读1w次。基于Netty最简单的WebSocket通讯基于Netty最简单的WebSocket通讯总览服务端EasyWsServerEasyWsServerHandler客户端EasyWsClientEasyWsClientHandler测试类EasyWsTest测试总览总共是五个文件: client EasyWsClient 客户端EasyWsClientHandler 客户端消息处理类server EasyWsServer 服务端EasyWsServerHandler 服务端_binarywebsocketframe

vue 赋值不改变_vue data对象重新赋值无效(未更改)的解决方式_vue赋值不成功-程序员宅基地

文章浏览阅读1w次。vue存在一个比较深的问题就是data中的属性对象如果在初始化的时候为{},那么后面在方法用普通的js语法赋值会无效这里是datadata() {undefinedreturn {undefinedmodel: {}};}这里是方法里的普通赋值afterUpload(response) {undefinedthis.model.icon = response.url;}普通方法会无效,需要使用vue提供的方法重新显示声明afterUpload(response_vue赋值不成功

推荐文章

热门文章

相关标签