map Javabean 互转

来源:互联网 发布:c定义二维数组下标越界 编辑:程序博客网 时间:2024/05/29 13:55
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.sql.Date;import java.util.HashMap;import java.util.Map;public class BeanToMapUtils {    /**     * 将一个 Map 对象转化为一个 JavaBean     * @param clazz 要转化的类型     * @param map 包含属性值的 map     * @return 转化出来的 JavaBean 对象     * @throws IntrospectionException 如果分析类属性失败     * @throws IllegalAccessException 如果实例化 JavaBean 失败     * @throws InstantiationException 如果实例化 JavaBean 失败     * @throws InvocationTargetException 如果调用属性的 setter 方法失败     */    @SuppressWarnings("rawtypes")    public static <T> T toBean(Class<T> clazz, Map map) {        T obj = null;        try {            BeanInfo beanInfo = Introspector.getBeanInfo(clazz);            obj = clazz.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 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。                    // 通过setProperty()方法获取参数数据类型                      Class fieldType = descriptor.getWriteMethod().getParameterTypes()[0];                      // 判断数据类型并从结果集中获取数据                      Object value = formatValue(map, fieldType, propertyName);                    if ("".equals(value)) {                        value = null;                    }                     Object[] args = new Object[1];                    args[0] =   value;                    try {                        descriptor.getWriteMethod().invoke(obj, args);                    } catch (InvocationTargetException e) {                        System.out.println("字段映射失败");                    }                }            }        } catch (IllegalAccessException e) {            System.out.println("实例化 JavaBean 失败");        } catch (IntrospectionException e) {            System.out.println("分析类属性失败");        } catch (IllegalArgumentException e) {            System.out.println("映射错误");        } catch (InstantiationException e) {            System.out.println("实例化 JavaBean 失败");        }        return (T) obj;    }    /**     * 将一个 JavaBean 对象转化为一个 Map     * @param bean 要转化的JavaBean 对象     * @return 转化出来的 Map 对象     * @throws IntrospectionException 如果分析类属性失败     * @throws IllegalAccessException 如果实例化 JavaBean 失败     * @throws InvocationTargetException 如果调用属性的 setter 方法失败     */    @SuppressWarnings("rawtypes")    public static Map toMap(Object bean) {        Class<? extends Object> clazz = bean.getClass();        Map<Object, Object> returnMap = new HashMap<Object, Object>();        BeanInfo beanInfo = null;        try {            beanInfo = Introspector.getBeanInfo(clazz);            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 = null;                    result = readMethod.invoke(bean, new Object[0]);                    if (null != propertyName) {                        propertyName = propertyName.toString();                    }                    if (null != result) {                        result = result.toString();                    }                    returnMap.put(propertyName, result);                }            }        } catch (IntrospectionException e) {            System.out.println("分析类属性失败");        } catch (IllegalAccessException e) {            System.out.println("实例化 JavaBean 失败");        } catch (IllegalArgumentException e) {            System.out.println("映射错误");        } catch (InvocationTargetException e) {            System.out.println("调用属性的 setter 方法失败");        }        return returnMap;    }    /**      * 将map中数据与bean中属性类型一致      *       * @param map      * @param fieldType      *            属性类型      * @param fieldName      *            属性名      * @return      */      private static Object formatValue(Map<String, String> map, Class fieldType, String fieldName) {          Object value = null;          if (fieldType == Integer.class || "int".equals(fieldType.getName())) {              if (map.get(fieldName) != null) {                  value = Integer.parseInt(map.get(fieldName));              }          } else if (fieldType == Float.class || "float".equals(fieldType.getName())) {              if (map.get(fieldName) != null) {                  value = Float.parseFloat(map.get(fieldName));              }          } else if (fieldType == Double.class || "double".equals(fieldType.getName())) {              if (map.get(fieldName) != null) {                  value = Double.parseDouble(map.get(fieldName));              }          } else if (fieldType == Date.class || fieldType == java.util.Date.class) {              if (map.get(fieldName) != null) {                  value = Date.valueOf(map.get(fieldName));              }          } else {              value = map.get(fieldName);          }          return value;      }  }` 

感谢 http://www.programgo.com/article/5133689737/ 的代码,但是代码有缺陷格式化数据是错的,老报数据类型异常。故把数据格式根据参数类型转化。

0 0
原创粉丝点击