zoukankan      html  css  js  c++  java
  • java中Map转化为bean

      Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值,在java编程中会经常用到。但是当我们进行业务逻辑的处理或着操作数据库时,往往应用的是我们自己定义的的Bean或VO来传递和存储数据,这就需要我们应用一个公共方法来将map中存储的数据转换为相对应的Bean或VO,主要用到java中反射技术。

      以下为本人在项目中用到的工具类,它囊括了我们常用的数据类型,代码如下:

    package test;

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.math.BigDecimal;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Map;
    //Map转化为bean
    public class MapToVoUtil {
        public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        public static <T> Object refelctBean(Map map , T t){
            Object obj = null;
            Class clazz = t.getClass();
            try {
                obj = clazz.newInstance();
                Method[] methods = clazz.getDeclaredMethods();
                for (Method method : methods) {
                    if(method.getName().startsWith("set")){
                        String key = method.getName().replace("set", "");
                        key = key.substring(0, 1).toLowerCase().concat(key.substring(1));
                        Object value = map.get(key);
                        if(value==null || value.equals("N/A")) continue;
                        Class<?>[]  paramType = method.getParameterTypes();
                        //根据参数类型执行对应的set方法给vo赋值
                        if(paramType[0] == String.class){
                            method.invoke(obj, String.valueOf(value));
                            continue;
                        }else if(paramType[0] == BigDecimal.class){
                            method.invoke(obj, new BigDecimal(value.toString()));
                            continue;
                        }else if(paramType[0] == Double.class){
                            method.invoke(obj, Double.parseDouble(value.toString()));
                            continue;
                        }else if(paramType[0] == Date.class){
                            method.invoke(obj, StringToDate(value.toString()));
                            continue;
                        }else if(paramType[0] == int.class || paramType[0] == Integer.class){
                            method.invoke(obj, Integer.valueOf(value.toString()));
                            continue;
                        }else if(paramType[0] == Boolean.class){
                            method.invoke(obj, Boolean.parseBoolean(value.toString()));
                            continue;
                        }else if(paramType[0] == char.class || paramType[0] == Character.class){
                            method.invoke(obj, value.toString().charAt(0));
                            continue;
                        }
                    }
                }
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            return obj;
        }

      //字符串转日期
        public static Date  StringToDate(String str){
            Date date = null;
            try {
                date = sdf.parse(str);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return date;
        }

      //日期转字符串
        public static String DateToString(Date date){
            String str = null;
            str = sdf.format(date);
            return str;
        }
    }

      在实际项目中我们可能还会遇到一些vo会继承一些baseVo,此时若想将通过map给baseVo中的属性赋值,那么我们就要在工具类中加入如下代码:

    Class superClazz = t.getClass().getSuperclass();

    Method[] superMethods = clazz.getDeclaredMethods();

    然后遍历,执行baseVo中的set方法,为父类属性赋值。此时可以在参数中加一个标记flag,调用者根据传入的Vo是否有继承的自定义的baseVo来决定是否执行上面的代码。

  • 相关阅读:
    [题解]luogu_P1627_中位数(排列乱搞
    [题解]luogu_P3313_旅行(树剖
    [题解]luogu_P3201_梦幻布丁(启发式合并
    [题解]luogu_P4127_同类分布(数位dp
    [题解]弹飞绵羊
    [题解]luogu_P3469_BLO(理解tarjan/割点
    [题解]luogu_P3304直径(直径必经边
    [HAOI2015]树上操作(树链剖分)
    [SCOI2005]扫雷(递推)
    洛谷3865 ST表
  • 原文地址:https://www.cnblogs.com/hhhshct/p/6921010.html
Copyright © 2011-2022 走看看