[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;
    }
}

说明:其中将数组转换为Set(上面第64行)参考了https://blog.csdn.net/my_precious/article/details/53010232

猜你喜欢

转载自blog.csdn.net/u010999809/article/details/81072031