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. linux mint17.3+vmware 12.1.1 流畅安装运行OSX EI capitan

    在linux mint17.3的vmware虚拟机中安装mac osx ei capitan系统 出于对苹果操作系统的好奇与喜爱,分别在宿主机操作系统为windows 7和linux mint17.3 ...

  2. 关于URL encode和parse

    from urllib import parses = 'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=baidu& ...

  3. 51nod1836-战忽局的手段【期望dp,矩阵乘法】

    正题 题目连接:http://www.51nod.com/Challenge/Problem.html#problemId=1836 题目大意 \(n\)个点\(m\)次随机选择一个点标记(可以重复) ...

  4. 解决联想R720双系统Ubuntu16.04的无线网卡开启问题及信号不稳定

    问题一:1.问题描述笔记本型号:Lenovo r720笔记本(i5-7300hq,gtx1060 maxq 6g),默认装入Win10系统,然而当装入Ubuntu16.04双系统时,会出现无线网卡(型 ...

  5. Digital Image Processing

    20190919 Review CCD:高端天文学,敏感度高,速度慢,成本高: CMOS:普遍使用,嵌入手机,速度快,有模式噪声(Pattern Noise,现在可以解决): 空间分辨率和时间分辨率: ...

  6. AI 事件驱动场景 Serverless 实践

    作者 | 李鹏(元毅) 来源 | Serverless 公众号 一.事件驱动框架:Knative Eventing 事件驱动是指事件在持续事务管理过程中,进行决策的一种策略.可以通过调动可用资源执行相 ...

  7. 鲲鹏展翅|SphereEx 获华为鲲鹏技术认证

    SphereEx Data Middleware 通过了华为鲲鹏技术认证并加入鲲鹏展翅伙伴计划,未来 SphereEx Data Middleware 产品将继续以分布式能力为基础,以数据安全.分布式 ...

  8. 搭建hexo博客遇到的问题

    搭建hexo博客遇到的问题 常用命令 hexo clean 清除hexo缓存 hexo generate 生成文章 hexo deploy 部署 hexo new post name 新建文章名 he ...

  9. python-docx处理Word必备工具

      我的理解 为什么会用到python-docx,因为近段时间下载了大量网文,但格式都是html的,我个人习惯使用word处理文字,于是就想法设法把html文档转换为word,首先要考虑的问题就是从h ...

  10. 一文弄懂CGAffineTransform和CTM

    一文弄懂CGAffineTransform和CTM 一些概念 坐标空间(系):视图(View)坐标空间与绘制(draw)坐标空间 CTM:全称current transformation matrix ...