Map与JavaBean实体类之间的相互转化

简介: Map与JavaBean实体类之间的相互转化
package com.newcapec.util.map;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.PropertyUtilsBean;
import com.newcapec.cloudpay.dao.po.HostUserInfo;
import com.newcapec.cloudpay.dao.po.WXUserInfo;
/**
 * @Title: Java 中 Map与JavaBean实体类之间的相互转化
 * @ClassName:MapBeanTransUtils.java
 * @Description:
 *
 * @Copyright 2016-2017  - Powered By 研发中心
 * @author: FLY
 * @date:2016年12月23日 上午10:11:49
 * @version V1.0
 */
public class MapBeanTransUtils {
   /**
    * 将一个 JavaBean 对象转化为一个 Map
    * 
    * @param bean
    *            要转化的JavaBean 对象
    * @return 转化出来的 Map 对象
    * @throws IntrospectionException
    *             如果分析类属性失败
    * @throws IllegalAccessException
    *             如果实例化 JavaBean 失败
    * @throws InvocationTargetException
    *             如果调用属性的 setter 方法失败
    */
   @SuppressWarnings({ "rawtypes", "unchecked" })
   public static Map bean2Map(Object bean)
         throws IntrospectionException, IllegalAccessException, InvocationTargetException {
      Class type = bean.getClass();
      Map returnMap = new HashMap();
      BeanInfo beanInfo = Introspector.getBeanInfo(type);
      PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
      for (int i = 0; i < propertyDescriptors.length; i++) {
         PropertyDescriptor descriptor = propertyDescriptors[i];
         String propertyName = descriptor.getName();
         if (!propertyName.equals("class")) {
            Method readMethod = descriptor.getReadMethod();
            Object result = readMethod.invoke(bean, new Object[0]);
            if (result != null) {
               returnMap.put(propertyName, result);
            } else {
               returnMap.put(propertyName, "");
            }
         }
      }
      return returnMap;
   }
   /**
    * 将一个 Map 对象转化为一个 JavaBean
    * 
    * @param type
    *            要转化的类型
    * @param map
    *            包含属性值的 map
    * @return 转化出来的 JavaBean 对象
    * @throws IntrospectionException
    *             如果分析类属性失败
    * @throws IllegalAccessException
    *             如果实例化 JavaBean 失败
    * @throws InstantiationException
    *             如果实例化 JavaBean 失败
    * @throws InvocationTargetException
    *             如果调用属性的 setter 方法失败
    */
   @SuppressWarnings("rawtypes")
   public static Object map2Bean(Class type, Map map)
         throws IntrospectionException, IllegalAccessException, InstantiationException, InvocationTargetException {
      BeanInfo beanInfo = Introspector.getBeanInfo(type); // 获取类属性
      Object obj = type.newInstance(); // 创建 JavaBean 对象
      // 给 JavaBean 对象的属性赋值
      PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
      for (int i = 0; i < propertyDescriptors.length; i++) {
         PropertyDescriptor descriptor = propertyDescriptors[i];
         String propertyName = descriptor.getName();
         if (map.containsKey(propertyName)) {
            // 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。
            Object value = map.get(propertyName);
            Object[] args = new Object[1];
            args[0] = value;
            descriptor.getWriteMethod().invoke(obj, args);
         }
      }
      return obj;
   }
   // 将JAVABEAN实体类转为map类型,然后返回一个map类型的值
   public static Map<String, Object> beanToMap(Object obj) {
      Map<String, Object> params = new HashMap<String, Object>(0);
      try {
         PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
         PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(obj);
         for (int i = 0; i < descriptors.length; i++) {
            String name = descriptors[i].getName();
            if (!"class".equals(name)) {
               params.put(name, propertyUtilsBean.getNestedProperty(obj, name));
            }
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
      return params;
   }
   public static void main(String[] args)
         throws IllegalAccessException, InstantiationException, InvocationTargetException, IntrospectionException {
      // 获取分隔符
      // System.out.println(System.getProperty("path.separator"));
      // java对象拷贝之BeanUtils.copyProperties() 用法
      WXUserInfo wxUserInfo = new WXUserInfo();
      HostUserInfo hostUserInfo = new HostUserInfo();
      wxUserInfo.setCustomerCode("11");
      wxUserInfo.setCustomerId("id");
      wxUserInfo.setCustomerName("name");
      wxUserInfo.setName("aa");
      wxUserInfo.setStuNo("001");
      wxUserInfo.setUserId("uset");
      // BeanUtils.copyProperties(wxUserInfo, hostUserInfo);
      // System.out.println(hostUserInfo);
      // Map<String, String> hashMap = new HashMap<String, String>();
      Map convertBean = MapBeanTransUtils.bean2Map(wxUserInfo);
      Map<String, Object> beanToMap = MapBeanTransUtils.beanToMap(wxUserInfo);
      // MapBeanTransUtils.beanToMap(obj)
      System.out.println(beanToMap);
      // map 遍历
      for (Map.Entry<String, Object> entry : beanToMap.entrySet()) {
         System.out.println("属性名称:"+entry.getKey()+"------"+"值:"+entry.getValue());
      }
   }
}


目录
相关文章
|
7月前
|
SQL 缓存 Java
Hibernate对象状态之间的神奇转换
Hibernate对象状态之间的神奇转换
|
JSON Java Apache
Bean自动映射工具对比及VO、DTO、PO、DO对象之间的转换
在实际的开发过程中,常常遇到各个层之间对象转换,比如 VO、DTO、PO、DO 等,而如果都是手动set、get,一旦属性较多时,操作起来不仅麻烦,而且浪费时间,因此经常会使用一些工具类,进行对象之间的转换,下面将对象与对象之间转换的方式进行对比,一级对象间的使用进行总结。
Bean自动映射工具对比及VO、DTO、PO、DO对象之间的转换
|
8月前
|
Java
类之间的比较
类之间的比较
35 0
|
10月前
|
编译器 C语言 C++
C++ 之什么是类 & 对象的关系?
C++ 之什么是类 & 对象的关系?
|
11月前
|
存储 编译器 C语言
C++ 基础篇之类 & 对象的关系
C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。
|
SQL Java 数据库连接
Hibernate的三种状态及相互转化
Hibernate的三种状态及相互转化
223 0
Hibernate的三种状态及相互转化
|
IDE 开发工具
实体类的属性映射怎么可以少了它?(二)
我们都知道,随着一个工程的越来越成熟,模块划分会越来越细,其中实体类一般存于 domain 之中,但 domain 工程最好不要被其他工程依赖,所以其他工程想获取实体类数据时就需要在各自工程写 model,自定义 model 可以根据自身业务需要映射相应的实体属性。这样一来,这个映射工程貌似并不简单了。阿粉差点就犯难了……
实体类的属性映射怎么可以少了它?(二)
|
IDE 开发工具
实体类的属性映射怎么可以少了它?(四)
我们都知道,随着一个工程的越来越成熟,模块划分会越来越细,其中实体类一般存于 domain 之中,但 domain 工程最好不要被其他工程依赖,所以其他工程想获取实体类数据时就需要在各自工程写 model,自定义 model 可以根据自身业务需要映射相应的实体属性。这样一来,这个映射工程貌似并不简单了。阿粉差点就犯难了……
实体类的属性映射怎么可以少了它?(四)

热门文章

最新文章