JAVA反射將兩個不同類中的型別和屬性名相同的進行賦值
阿新 • • 發佈:2019-02-07
當我們在開發時,有時候會遇見前端傳進來的model有很多值,且model與後端entity很相似,但又不包括entity的全部屬性,包含了大部分甚至有其他的屬性,這是又需要把model中與entity中相同的值或者entity有用的屬性值賦值給entity。如果只有簡單的幾個值我們通過get()和set()就可以輕鬆的解決。但是如果有大量的需要賦值,這時候get和set方法的程式碼就太繁多。這時候就需要簡化程式碼。下面就是通過反射進行的賦值轉換。(當然這也不侷限於前端傳進的model,任何需要轉換的地方都可以使用)
public class Conversion { private static Logger logger = LoggerFactory.getLogger(Conversion.class); //將model中與entity中型別和名稱相同的屬性值賦值給對應的entity的屬性,並返回entity public static <T1, T2> T2 TypeConversion(T1 model, T2 entity) { List<Map<String, Object>> modelList = getFiledInfo(model); List<Map<String, Object>> entityList = getFiledInfo(entity); for (Map e : entityList) { for (Map m : modelList) { /** * 判斷型別和屬性名是否都相同 */ if (e.get("type").toString().equals(m.get("type").toString()) && e.get("name") .toString() .equals(m.get("name").toString())) { try { Field f = entity.getClass().getDeclaredField(e.get("name").toString()); f.setAccessible(true); f.set(entity, m.get("value")); } catch (Exception ex) {//檢視其父類屬性 try { Field f = entity.getClass().getSuperclass().getDeclaredField(e.get("name").toString()); f.setAccessible(true); f.set(entity, m.get("value")); } catch (Exception e1) { logger.error(ex.getMessage(), "conversion型別轉換錯誤 " + ex); } } } } } return entity; } /** * 根據屬性名獲取屬性值 */ private static Object getFieldValueByName(String fieldName, Object o) { try { String firstLetter = fieldName.substring(0, 1).toUpperCase(); String getter = "get" + firstLetter + fieldName.substring(1); Method method = o.getClass().getMethod(getter, new Class[]{}); Object value = method.invoke(o, new Object[]{}); return value; } catch (Exception e) { logger.error(e.getMessage(), e); return null; } } /** * 獲取屬性名陣列 */ private static String[] getFiledName(Object o) { Field[] fields = o.getClass().getDeclaredFields(); String[] fieldNames = new String[fields.length]; for (int i = 0; i < fields.length; i++) { fieldNames[i] = fields[i].getName(); } return fieldNames; } /** * 獲取屬性型別(type),屬性名(name),屬性值(value)的map組成的list */ private static List<Map<String, Object>> getFiledInfo(Object o) { List<Map<String, Object>> list = new ArrayList<>(); List<Field> fields = new ArrayList<>(); fields.addAll(Arrays.asList(o.getClass().getDeclaredFields())); /** * 如果存在父類,獲取父類的屬性值,型別,名稱並新增到一起 */ Class sc = o.getClass().getSuperclass(); if (sc != null) { fields.addAll(Arrays.asList(sc.getDeclaredFields())); } for (Field field : fields) { Map<String, Object> infoMap = new HashMap<>(); infoMap.put("type", field.getType().toString()); infoMap.put("name", field.getName()); infoMap.put("value", getFieldValueByName(field.getName(), o)); list.add(infoMap); } return list; } }