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的更多相关文章

  1. beantool.map2Bean(map,obj)

  2. 03-封装BeanUtil工具类(javabean转map和map转javabean对象)

    package com.oa.test; import java.beans.BeanInfo; import java.beans.IntrospectionException; import ja ...

  3. 2-java内省机制(Introspector)

    来一个简单的示例吧 package com.my.test; import java.beans.BeanInfo; import java.beans.Introspector; import ja ...

  4. JavaBean和Map的相互转换

    JavaBean和Map的相互转换 一.JavaBean 1.什么是JavaBean? JavaBean其实就是一种遵循特定写法的类,必须遵循一定的规范: 类必须由public修饰,并且保证有公共的无 ...

  5. 对象属性封装到map中

    import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import java.lang.reflect.Modi ...

  6. java中两个对象间的属性值复制,比较,转为map方法实现

    package com.franson.study.util; import java.lang.reflect.InvocationTargetException; import java.lang ...

  7. java方式连接数据操作数据库

    package com.bdqn.dao.impl; import java.io.IOException;import java.io.InputStream;import java.io.Seri ...

  8. springboot整合springdata-jpa

    1.简介  SpringData : Spring 的一个子项目.用于简化数据库访问,支持NoSQL 和 关系数据存储.其主要目标是使数据库的访问变得方便快捷. SpringData 项目所支持 No ...

  9. 做一次面向对象的体操:将JSON字符串转换为嵌套对象的一种方法

    背景与问题 在 <一个略复杂的数据映射聚合例子及代码重构> 一文中,将一个JSON字符串转成了所需要的订单信息Map.尽管做了代码重构和配置化,过程式的代码仍然显得晦涩难懂,并且客户端使用 ...

随机推荐

  1. [转载]提升SQLite数据插入效率低、速度慢的方法

    转载地址:http://blog.csdn.net/chenguanzhou123/article/details/9376537#,如果有侵犯原创,请留言告知,本人会及时删除. 前言 SQLite数 ...

  2. P7405-[JOI 2021 Final]雪玉【二分】

    正题 题目链接:https://www.luogu.com.cn/problem/P7405 题目大意 \(n\)个点在坐标轴上,\(q\)次每次所有点向一个方向移动若干步,每个点的权值是它第一次覆盖 ...

  3. P6091-[模板]原根

    正题 题目链接:https://www.luogu.com.cn/problem/P6091 题目大意 给出一个数\(p\),求出它的所有在\([0,p]\)的原根. 解题思路 原根的定义,\(\de ...

  4. 从0到1告诉你搭建完整Python+requests接口自动化测试框架!

    前言 很多小伙伴不知道什么是框架?框架有哪些东西? 一步步从需求分析到报告生成告诉你如何搭自动化建框架. 学完unittest后这里基本上可以搭建一个简易的项目框架了,我们可以用一条run_main. ...

  5. 深入浅出WPF-12.绘图与动画

    绘图 1)Brush(画刷) SolidColorBrush实心画刷,直接使用颜色赋值 LinearGradientBrush线性渐变画刷,色彩沿设定的直线方向.按设定的变化点进行渐变 RadialG ...

  6. firewalld防火墙详解

    众所周知,在RHEL7系统中,firewalld防火墙取代了iptables防火墙.我们都知道iptables的防火墙策略是交由内核层面的netfilter网络过滤器来处理的,而firewalld则是 ...

  7. Firewalls命令行配置

    1.指定端口开放查询.开放.关闭端口 # 查询端口是否开放 firewall-cmd --query-port=8080/tcp # 开放80端口 firewall-cmd --permanent - ...

  8. The type name or alias SqlServer could not be resolved.Please check your configuration

    The type name or alias SqlServer could not be resolved.Please check your configuration file.... 检查一下 ...

  9. CF487E Tourists + 圆方树学习笔记(圆方树+树剖+线段树+multiset)

    QWQ果然我已经什么都学不会的人了. 这个题目要求的是图上所有路径的点权和!QWQ(我只会树上啊!) 这个如果是好啊 这时候就需要 圆方树! 首先在介绍圆方树之前,我们先来一点简单的前置知识 首先,我 ...

  10. 【Python】 第三周:基本数据类型

    整数 python整数无限制 二进制:以0b或者0B开头,例如: 0b010,-0B101 八进制:以0o或者0O开头,例如:0o123,-0O456 浮点数 浮点数间运算存在不确定尾数,不是bug ...