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. P7599-[APIO2021]雨林跳跃【二分,倍增,ST表】

    正题 题目链接:https://www.luogu.com.cn/problem/P7599 题目大意 \(n\)棵树,在某棵树上时可以选择向左右两边第一棵比它高的树跳,现在\(q\)次询问从\([A ...

  2. 前端规范之JS代码规范(ESLint + Prettier)

    代码规范是软件开发领域经久不衰的话题,几乎所有工程师在开发过程中都会遇到或思考过这一问题.而随着前端应用的大型化和复杂化,越来越多的前端团队也开始重视代码规范.同样,前段时间,笔者所在的团队也开展了一 ...

  3. join方法个人理解

    首先抛出对join的疑问 如果我有一个a线程,一个b线程 那此时 a.start(); b.start(); a.join(); b.join(); 是否意思是a线程先执行完,然后再执行b线程; 如果 ...

  4. FastAPI(62)- FastAPI 部署在 Docker

    Docker 学习 https://www.cnblogs.com/poloyy/p/15257059.html 项目结构 . ├── app │   ├── __init__.py │ └── ma ...

  5. 使用 WPF + Chrome 内核实现 在线客服系统 的复合客服端程序

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 免费使用 & 私有化部署免费下载:https://docs.sh ...

  6. mysql 建表后 重新构建 自增字段 (保留 原有字段结构)

    添加字段 1.去除原id的自增功能:ALTER TABLE A_A MODIFY COLUMN id int(10) NOT NULL FIRST ; 2.添加名称为cstId,类型为bigint的字 ...

  7. bzoj2064分裂(dp)

    题目大意: 给定一个初始集合和目标集合,有两种操作:1.合并集合中的两个元素,新元素为两个元素之和 2.分裂集合中的一个元素,得到的两个新元素之和等于原先的元素.要求用最小步数使初始集合变为目标集合, ...

  8. 2020.1.30--vj补题

    C - C CodeForces - 991C 题目内容: After passing a test, Vasya got himself a box of n candies. He decided ...

  9. HttpServletResponse 入门

    继承体系 功能: 设置响应消息 1. 设置响应行 格式:HTTP/1.1 200 ok 设置状态码:setStatus(int sc) 2. 设置响应头:setHeader(String name, ...

  10. C/C++入门级小游戏——开发备忘录

    很多工科的学生在大一都有一门课程,叫C语言程序设计.大概就是装个IDE然后和一个黑乎乎的窗口打交道,期末到了考完试就结束了.然而很多人可能都有一个疑惑:C语言究竟能干什么?除开嵌入式单片机这些高大上的 ...