map2bean & bean2map
1,自己实现; /**
* @author xx
* @since 2020/7/8
*/
@Slf4j
public class JavaBeanUtils { /**
* 实体类转map
* 效率较低
*
* @param obj
* @return
*/
public static Map<String, Object> convertBeanToMap(Object obj) {
if (obj == null) {
return null;
}
Map<String, Object> map = new HashMap<String, Object>(16);
try {
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor property : propertyDescriptors) {
String key = property.getName();
// 过滤class属性
if (!key.equals("class")) {
// 得到property对应的getter方法
Method getter = property.getReadMethod();
Object value = getter.invoke(obj);
if (null == value) {
map.put(key, "");
} else {
map.put(key, value);
}
}
}
} catch (Exception e) {
log.error("convertBean2Map Error:", e);
}
return map;
} /**
* map 转实体类
*
* @param clazz
* @param map
* @param <T>
* @return
*/
public static <T> T convertMapToBean(Class<T> clazz, Map<String, Object> map) {
T obj = null;
try {
BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
// 创建 JavaBean 对象
obj = clazz.newInstance();
// 给 JavaBean 对象的属性赋值
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor descriptor : propertyDescriptors) {
String propertyName = descriptor.getName();
if (map.containsKey(propertyName)) {
// 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。
Object value = map.get(propertyName);
if ("".equals(value)) {
value = null;
}
Object[] args = new Object[1];
args[0] = value;
descriptor.getWriteMethod().invoke(obj, args);
}
}
} catch (IllegalAccessException e) {
log.error("convertMapToBean 实例化JavaBean失败 Error:", e);
} catch (IntrospectionException e) {
log.error("convertMapToBean 分析类属性失败 Error:", e);
} catch (IllegalArgumentException e) {
log.error("convertMapToBean 映射错误 Error:", e);
} catch (InstantiationException e) {
log.error("convertMapToBean 实例化 JavaBean 失败 Error:", e);
} catch (InvocationTargetException e) {
log.error("convertMapToBean字段映射失败 Error:", e);
} catch (Exception e) {
log.error("convertMapToBean Error:", e);
}
return (T) obj;
} /**
* 将map通过反射转化为实体
*
* @param map
* @param obj
* @return
* @throws Exception
*/
public static Object mapToModel(Map<String, Object> map, Object obj) throws Exception {
if (!map.isEmpty()) {
for (String key : map.keySet()) {
Object value = null;
if (!key.isEmpty()) {
value = map.get(key);
}
Field[] fields = null;
fields = obj.getClass().getDeclaredFields();
String clzName = obj.getClass().getSimpleName();
for (Field field : fields) {
int mod = field.getModifiers();
if (field.getName().toUpperCase().equals(key.toUpperCase())) {
field.setAccessible(true);
//进行类型判断
String type = field.getType().toString();
if (Objects.isNull(value)) {
continue;
}
if (type.endsWith("String")) {
value = value.toString();
}
if (type.endsWith("Date")) {
value = new Date(value.toString());
}
if (type.endsWith("Boolean")) {
value = Boolean.getBoolean(value.toString());
}
if (type.endsWith("int")) {
value = new Integer(value.toString());
}
if (type.endsWith("Long")) {
value = new Long(value.toString());
}
field.set(obj, value);
}
}
}
}
return obj;
} /**
* 实体对象转成Map
*
* @param obj 实体对象
* @return
*/
public static Map<String, Object> object2Map(Object obj) {
Map<String, Object> map = new HashMap<>(16);
if (obj == null) {
return map;
}
Class clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
try {
for (Field field : fields) {
field.setAccessible(true);
map.put(field.getName(), field.get(obj));
}
} catch (Exception e) {
log.error("object2Map Error:", e);
}
return map;
} /**
* Map转成实体对象
*
* @param map map实体对象包含属性
* @param clazz 实体对象类型
* @return
*/
public static Object map2Object(Map<String, Object> map, Class<?> clazz) {
if (map == null) {
return null;
}
Object obj = null;
try {
obj = clazz.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()));
}
} catch (Exception e) {
log.error("map2Object Error:", e);
}
return obj;
} public static void main(String[] args) { Student s = new Student();
s.setUserName("ZHH");
s.setUserName2("ZHH");
s.setUserName3("ZHH");
s.setUserName4("ZHH");
s.setUserName5("ZHH");
s.setDate(new Date());
s.setAge(24);
long sss = System.currentTimeMillis();
System.out.println("==" + object2Map(s));
long ddd = System.currentTimeMillis();
//0ms
System.out.println(ddd - sss); Map<String, Object> map = new HashMap<>(4);
map.put("userName", "zhh");
map.put("userName2", "zhh");
map.put("userName3", "zhh");
map.put("userName4", "zhh");
map.put("userName5", "zhh");
map.put("age", 24);
map.put("date", new Date()); long aaa = System.currentTimeMillis();
System.out.println("++" + map2Object(map, Student.class));
long www = System.currentTimeMillis();
//0ms
System.out.println(www - aaa); long q = System.currentTimeMillis();
System.out.println("==22++" + convertBeanToMap(s));
long f = System.currentTimeMillis();
//16ms
System.out.println(f - q); try {
// DateTime parse = DateUtil.parse(new Date().toString());
//
// System.out.println("date:" + parse);
} catch (Exception e) {
e.printStackTrace();
} long c = System.currentTimeMillis();
System.out.println("==22++" + convertBeanToMap(s));
long d = System.currentTimeMillis();
//0ms
System.out.println(d - c); long a = System.currentTimeMillis();
System.out.println("++22==" + convertMapToBean(Student.class, map));
long b = System.currentTimeMillis();
//0ms
System.out.println(b - a); try {
long start = System.currentTimeMillis();
System.out.println("++3333333==" + mapToModel(map, new Student()).toString());
long end = System.currentTimeMillis();
//0ms
System.out.println(end - start);
} catch (Exception e) {
e.printStackTrace();
}
} } 2,也可以直接使用Hutool提供的MapUtil实现
map2bean & bean2map的更多相关文章
- beantool.map2Bean(map,obj)
- 03-封装BeanUtil工具类(javabean转map和map转javabean对象)
package com.oa.test; import java.beans.BeanInfo; import java.beans.IntrospectionException; import ja ...
- 2-java内省机制(Introspector)
来一个简单的示例吧 package com.my.test; import java.beans.BeanInfo; import java.beans.Introspector; import ja ...
- JavaBean和Map的相互转换
JavaBean和Map的相互转换 一.JavaBean 1.什么是JavaBean? JavaBean其实就是一种遵循特定写法的类,必须遵循一定的规范: 类必须由public修饰,并且保证有公共的无 ...
- 对象属性封装到map中
import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import java.lang.reflect.Modi ...
- java中两个对象间的属性值复制,比较,转为map方法实现
package com.franson.study.util; import java.lang.reflect.InvocationTargetException; import java.lang ...
- java方式连接数据操作数据库
package com.bdqn.dao.impl; import java.io.IOException;import java.io.InputStream;import java.io.Seri ...
- springboot整合springdata-jpa
1.简介 SpringData : Spring 的一个子项目.用于简化数据库访问,支持NoSQL 和 关系数据存储.其主要目标是使数据库的访问变得方便快捷. SpringData 项目所支持 No ...
- 做一次面向对象的体操:将JSON字符串转换为嵌套对象的一种方法
背景与问题 在 <一个略复杂的数据映射聚合例子及代码重构> 一文中,将一个JSON字符串转成了所需要的订单信息Map.尽管做了代码重构和配置化,过程式的代码仍然显得晦涩难懂,并且客户端使用 ...
随机推荐
- CVE-2012-0158 漏洞分析报告
Office 2003 sp3(CVE-2012-0158)漏洞分析报告 软件名称:Office 2003 sp3 软件版本:2.0 漏洞模块:MSCOMCTL.ocx 模块版本:2.0.0. ...
- 鸿蒙内核源码分析(fork篇) | 一次调用,两次返回 | 百篇博客分析OpenHarmony源码 | v45.03
百篇博客系列篇.本篇为: v45.xx 鸿蒙内核源码分析(Fork篇) | 一次调用,两次返回 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内 ...
- 鸿蒙内核源码分析(用栈方式篇) | 程序运行场地谁提供的 | 百篇博客分析OpenHarmony源码 | v20.04
百篇博客系列篇.本篇为: v20.xx 鸿蒙内核源码分析(用栈方式篇) | 程序运行场地谁提供的 | 51.c.h .o 精读内核源码就绕不过汇编语言,鸿蒙内核有6个汇编文件,读不懂它们就真的很难理解 ...
- CF917D-Stranger Trees【矩阵树定理,高斯消元】
正题 题目链接:https://www.luogu.com.cn/problem/CF917D 题目大意 给出\(n\)个点的一棵树,对于每个\(k\)求有多少个\(n\)个点的树满足与给出的树恰好有 ...
- VueCLI3 创建vue项目
关于旧版本 Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过 npm uninstall vu ...
- 解析csv数据绘制曲线图
一个解析csv数据的小工具,所做项目中要查看脉冲图谱,经理就让我这个刚入职的小萌新写了个小程序.同事将csv格式的脉冲数据发给我,我的想法就是,将这些csv里的数据作为纵轴,x++为横轴,绘制出折线图 ...
- Django序列化页和过滤页规范
序列化类:serializers.py from rest_framework import serializers from goods.models import Goods, GoodsCate ...
- ServletContext 学习
ServletContext web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用: 1.共享数据 在这个Servlet中保存了数 ...
- Golang/Java 实现无重复字符的最长子串 - LeetCode 算法
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-subs ...
- python查询对像所有方法
鉴于学习时好多参数对像都不知道是什么玩意有什么方法,搜了半天一个 """arg为一个对像,下面是打印所有对像方法"""for i, func ...