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來決定是否執行上面的代碼。