技术标签: 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);
}
以上方法本人均实际测试通过。
文章浏览阅读2.3k次。明确概念:C语言不允许单独声明未定义长度的数组。C99中,一位数组的声明(同时赋值)时可以不写数组长度。如 int myarray[]={1,2,3,4,5}; 的原因是,编译器会根据赋值自动给出数组长度。但是,二维数组的声明时必须写上边界。如下的写法unsigned int grades[][] = { {80,81,82,83,8..._c语言二维指针数组 一维固定,二维变长
文章浏览阅读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
文章浏览阅读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
文章浏览阅读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 能用局部变量吗
文章浏览阅读367次。毕设记录011. redis作用:数据库访问压⼒:为了降低对数据库的访问压⼒,当多个⽤户请求相同的数据时,我们可以将第⼀次从数据库查询到数据进⾏缓存(存储在内存中),以减少对数据库的访问次数⾸⻚数据的加载效率:将⼤量的且不经常改变的数据缓存在内容中,可以⼤幅度提⾼访问速度集群部署下的商品超卖:分布式事务⽤户登录:分布式会话2. 向redis中存储数据不同数据结构的添加操作//1.string//添加数据 set key valuestringRedisTemplate.boundVa_毕设数据缓存可以不做吗
文章浏览阅读7.5k次,点赞2次,收藏3次。今天总是报一个
文章浏览阅读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
文章浏览阅读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配置
文章浏览阅读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 经纬度定位
文章浏览阅读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 ..._完成一个使用管道命令的实例
文章浏览阅读1w次。基于Netty最简单的WebSocket通讯基于Netty最简单的WebSocket通讯总览服务端EasyWsServerEasyWsServerHandler客户端EasyWsClientEasyWsClientHandler测试类EasyWsTest测试总览总共是五个文件: client EasyWsClient 客户端EasyWsClientHandler 客户端消息处理类server EasyWsServer 服务端EasyWsServerHandler 服务端_binarywebsocketframe
文章浏览阅读1w次。vue存在一个比较深的问题就是data中的属性对象如果在初始化的时候为{},那么后面在方法用普通的js语法赋值会无效这里是datadata() {undefinedreturn {undefinedmodel: {}};}这里是方法里的普通赋值afterUpload(response) {undefinedthis.model.icon = response.url;}普通方法会无效,需要使用vue提供的方法重新显示声明afterUpload(response_vue赋值不成功