[java反射]將Map中的屬性值轉換至物件Object中
阿新 • • 發佈:2019-02-08
轉換規則為: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; } }