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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM