Map对象与实体类Object对象转换
方法一 fastjson 转换
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.46.sec01</version>
</dependency>
/*** 将Map转换为对象* @param paramMap* @param cls* @return*/
public static <T> T parseMap2Object(Map<String, Object> paramMap, Class<T> cls) {// return JSON.parseObject(JSON.toJSONString(Map<String, ? extends Object>), Class<T> cls);return JSONObject.parseObject(JSONObject.toJSONString(paramMap), cls);
}
方法二 BeanUtils转换
BeanUtils.populate(Object bean, Map<String, ? extends Object> properties)
public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception { if (map == null) return null; Object obj = beanClass.newInstance(); org.apache.commons.beanutils.BeanUtils.populate(obj, map); return obj;
} public static Map<?, ?> objectToMap(Object obj) { if(obj == null) return null; return new org.apache.commons.beanutils.BeanMap(obj);
}
方法三 Introspector转换
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;
} 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 转换
public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception { if (map == null) return null; Object obj = beanClass.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())); } return obj;
} 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;
}
/*** 利用反射将map集合封装成bean对象* * @param params* @param clazz* @return*/
public static <T> T mapToBean(Map<String, Object> map, Class<?> clazz) throws Exception {Object obj = clazz.newInstance();if (map != null && !map.isEmpty() && map.size() > 0) {for (Map.Entry<String, Object> entry : map.entrySet()) {String propertyName = entry.getKey(); // 属性名Object value = entry.getValue(); // 属性值String setMethodName = "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);Field field = getClassField(clazz, propertyName); //获取和map的key匹配的属性名称if (field == null){continue;}Class<?> fieldTypeClass = field.getType();value = convertValType(value, fieldTypeClass);try {clazz.getMethod(setMethodName, field.getType()).invoke(obj, value);} catch (NoSuchMethodException e) {e.printStackTrace();}}}return (T) obj;
}/*** 根据给定对象类匹配对象中的特定字段* @param clazz* @param fieldName* @return*/
private static Field getClassField(Class<?> clazz, String fieldName) {if (Object.class.getName().equals(clazz.getName())) {return null;}Field[] declaredFields = clazz.getDeclaredFields();for (Field field : declaredFields) {if (field.getName().equals(fieldName)) {return field;}}Class<?> superClass = clazz.getSuperclass(); //如果该类还有父类,将父类对象中的字段也取出if (superClass != null) { //递归获取return getClassField(superClass, fieldName);}return null;
}/*** 将map的value值转为实体类中字段类型匹配的方法* @param value* @param fieldTypeClass* @return*/
private static Object convertValType(Object value, Class<?> fieldTypeClass) {Object retVal = null;if (Long.class.getName().equals(fieldTypeClass.getName())|| long.class.getName().equals(fieldTypeClass.getName())) {retVal = Long.parseLong(value.toString());} else if (Integer.class.getName().equals(fieldTypeClass.getName())|| int.class.getName().equals(fieldTypeClass.getName())) {retVal = Integer.parseInt(value.toString());} else if (Float.class.getName().equals(fieldTypeClass.getName())|| float.class.getName().equals(fieldTypeClass.getName())) {retVal = Float.parseFloat(value.toString());} else if (Double.class.getName().equals(fieldTypeClass.getName())|| double.class.getName().equals(fieldTypeClass.getName())) {retVal = Double.parseDouble(value.toString());} else {retVal = value;}return retVal;
}/*** 对象转map* @param obj* @return*/
private static Map<String, Object> objToMap(Object obj) {Map<String, Object> map = new HashMap<String, Object>();Field[] fields = obj.getClass().getDeclaredFields(); // 获取f对象对应类中的所有属性域for (int i = 0, len = fields.length; i < len; i++) {String varName = fields[i].getName();varName = varName.toLowerCase(); // 将key置为小写,默认为对象的属性try {boolean accessFlag = fields[i].isAccessible(); // 获取原来的访问控制权限fields[i].setAccessible(true); // 修改访问控制权限Object o = fields[i].get(obj); // 获取在对象f中属性fields[i]对应的对象中的变量if (o != null){map.put(varName, o.toString());}fields[i].setAccessible(accessFlag); // 恢复访问控制权限} catch (IllegalArgumentException ex) {ex.printStackTrace();} catch (IllegalAccessException ex) {ex.printStackTrace();}}return map;
}
Map对象与实体类Object对象转换相关推荐
- JS中集合对象(Array、Map、Set)及类数组对象的使用与对比
JS中集合对象(Array.Map.Set)及类数组对象的使用与对比 在使用js编程的时候,常常会用到集合对象,集合对象其实是一种泛型,在js中没有明确的规定其内元素的类型,但在强类型语言譬如Java ...
- 简单介绍实体类或对象序列化时,忽略为空属性的操作
这篇文章主要介绍了实体类或对象序列化时,忽略为空属性的操作,具有很好的参考价值,希望对大家有所帮助.如有错误或未考虑完全的地方,望不吝赐教 第一种,在配置文件配置 在application.xml直接 ...
- 在一个电子商务网站应用中,涉及的实体信息类有很多,比如用户类User和用户地址类Address; 而每一个实体类的对象信息要存储到相应的数据库表中,如userTable和addressTable。
在一个电子商务网站应用中,涉及的实体信息类有很多,比如用户类User和用户地址类Address; 而每一个实体类的对象信息要存储到相应的数据库表中,如userTable和addressTable. ...
- java/03/类与对象,深入分析类与对象(权限修饰,构造方法和简单java类),数组的定义及使用
java/03/类与对象,深入分析类与对象(权限修饰,构造方法和简单java类),数组的定义及使用 七十年代,IBM的Smalltalk语言最先推广面向对象,后来C语言变为C++,后来C++又产生了J ...
- 面对对象+面对过程+类与对象+this关键字+构造方法及重载+面对对象练习
面对对象概述: 类与对象2.构造方法3.访问权限4.继承5.多态(最重要)6.抽象和接口7.内存分析 面向对象与面向过程区别: 面向过程:侧重的是过程. 优点:简单.缺点:代码量过大后难以维护. 面向 ...
- android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...
Android中的传递有两个方法,一个是Serializable,另一个是Parcelable. Serializable是J2SE本身就支持的.而Parcelable是Android所特有的. 二者 ...
- Java通过Fastjson实现JSONObject对象、Json字符串以及Java实体类之间互相转换
导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</arti ...
- 将远程服务器获取的linkedhashMap对象转为实体类对象
微服务中从其他服务获取过来的对象,本来传的是实体类对象 , 但是接受到的参数却是linkedhashMap类型的对象 , 如果强转成自定义的实体类型会报错,因此可以利用ObjectMapper转换. ...
- JPA 一对一设置无效,连表查询的时候另外一个实体类的对象值为空
文章目录 1.前言 2.错误示例: 3.正确示例 4.讲解 1.前言 今天在使用 JPA 的时候发现了这样一个问题,User 表和 OrganInfo 表配置了一对一关系,连表查询的时候只能够查到表 ...
最新文章
- 如何提升自己的Web前端技术
- Android--混淆打包找不到资源类的…
- C语言中const的用法
- bootstrap panel 和table的使用
- tomcat 、jsp、 servlet 、jstl版本对应
- git 提交文件_git原理与实战
- PHP笔记-平润年判断例子
- java选择安装路径的功能怎么实现_水槽怎么选择,从安装方式,材质功能,江水平给你一次性说清楚...
- The Largest Clique UVA - 11324( 强连通分量 + dp最长路)
- pytorch nn.MSELoss
- TypeScript算法专题 - blog2 - 单链表节点的索引、结点删除与链表反转
- ztree带有选项框的树形菜单使用
- VUE全局this指向
- 信息学奥赛一本通:1096:数字统计
- 日语中特殊汉字「髙」写入文件后乱码
- 车载网络测试 - 车载以太网 - ICMP详细解析
- 积木拼图游戏-儿童游戏免费拼图3-6岁
- 软考笔记——第七章--数据结构
- 求解两圆相交的交点坐标
- 基于智慧多功能灯杆的智慧道路(智慧公交)建设系统整体解决方案