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包