java中Map转化为bean

it2022-05-05  137

  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转化为beanpublic 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来决定是否执行上面的代码。

转载于:https://www.cnblogs.com/hhhshct/p/6921010.html

相关资源:java Map转换成bean,利用java反射以及java和bean包

最新回复(0)