1. 程式人生 > >[java反射]將Map中的屬性值轉換至物件Object中

[java反射]將Map中的屬性值轉換至物件Object中

轉換規則為:Map中的key是新物件的屬性名,Map中的value是新物件中的屬性值

import org.apache.commons.lang3.ArrayUtils;
import java.lang.reflect.Field;
import java.util.*;

public class MapUtil {
	/**
     * 將map轉換為object,轉換全部屬性(按照key和物件屬性之間的關係進行轉換)
     * @param map
     * @param t
     * @param <T>
     * @return
     */
    public static <T> T  mapToObject(Map<String, Object> map, T t) {
        return mapToObject(map, t,null);
    }

    /**
     * 將map轉換為object,排除指定key
     * @param map
     * @param t
     * @param excludeKeys
     * @param <T>
     * @return
     */
    public static <T> T  mapToObject(Map<String, Object> map, T t, String[] excludeKeys) {
        Class beanClass = t.getClass();
        String[] declaredFieldsName = getDeclaredFieldsName(beanClass);
        if (ArrayUtils.isNotEmpty(excludeKeys)) {
            MapUtil.removeEntries(map, excludeKeys);
        }
        for (Object k : map.keySet()) {
            Object v = map.get(k);
            if (ArrayUtils.contains(declaredFieldsName, k.toString())) {
                try {
                    Field field = beanClass.getDeclaredField(k.toString());
                    field.setAccessible(true);
                    field.set(t, v);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return t;
    }
	
	/**
     * 獲取轉換後的物件的所有屬性名稱,以字串陣列形式返回
     * @param beanClass
     * @return
     */
    public static String[] getDeclaredFieldsName(Class beanClass) {
        Field[] fields = beanClass.getDeclaredFields();
        int size = fields.length;
        String[] fieldsName = new String[size];
        for (int i = 0; i < size; i++) {
            fieldsName[i] = fields[i].getName();
        }
        return fieldsName;
    }
}

後來,在使用過程中又需要能夠:

(1)轉換Map<String,String>,Map<String,Integer>等其他的Map(使用泛型解決)

(2)不只是能夠指定排除某些key,還能夠指定包含某些key(使用判斷解決)

程式碼改寫如下:

import org.apache.commons.lang3.ArrayUtils;
import java.lang.reflect.Field;
import java.util.*;

public class MapUtil {

	/**
     * 將map轉換為object,轉換全部屬性(按照key和物件屬性之間的關係進行轉換)
     * @param map
     * @param t
     * @param <T>
     * @return
     */
    public static <T> T  mapToObject(Map<String, Object> map, T t) {
        return mapToObject(map, t, null, 0);
    }

    /**
     * 將map轉換為object,排除指定key
     * @param map
     * @param t
     * @param keys
     * @param <T>
     * @return
     */
    public static <T, K, V> T  mapToObjectExclude(Map<K, V> map, T t, K[] keys) {
        return mapToObject(map, t, keys, 0);
    }

    /**
     * 將map轉換為object,轉換指定key
     * @param map
     * @param t
     * @param keys
     * @param <T>
     * @return
     */
    public static <T, K, V> T  mapToObjectInclude(Map<K, V> map, T t, K[] keys) {
        return mapToObject(map, t, keys, 1);
    }


    /**
     * 將map轉換為object
     * @param map
     * @param t
     * @param keys
     * @param option 0 需要排除的key;1 需要包含的key
     * @param <T>
     * @return
     */
    public static <T, K, V> T  mapToObject(Map<K, V> map, T t, K[] keys, int option) {
        Class beanClass = t.getClass();
        String[] declaredFieldsName = getDeclaredFieldsName(beanClass);
        Set<K> keySet = new HashSet<K>();
        switch (option) {
            case 0: // 需要排除的key
                if (ArrayUtils.isNotEmpty(keys)) {
                    MapUtil.removeEntries(map, keys);
                }
                keySet = map.keySet();
                break;
            case 1: // 需要包含的key
                keySet = new HashSet<K>(Arrays.asList(keys));
                break;
        }

        for (Object k : keySet) {
            V v = map.get(k);
            if (ArrayUtils.contains(declaredFieldsName, k.toString())) {
                try {
                    Field field = beanClass.getDeclaredField(k.toString());
                    field.setAccessible(true);
                    field.set(t, v);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        return t;
    }
	
	/**
     * 獲取轉換後的物件的所有屬性名稱,以字串陣列形式返回
     * @param beanClass
     * @return
     */
    public static String[] getDeclaredFieldsName(Class beanClass) {
        Field[] fields = beanClass.getDeclaredFields();
        int size = fields.length;
        String[] fieldsName = new String[size];
        for (int i = 0; i < size; i++) {
            fieldsName[i] = fields[i].getName();
        }
        return fieldsName;
    }
}