1. 程式人生 > >JAVA反射將兩個不同類中的型別和屬性名相同的進行賦值

JAVA反射將兩個不同類中的型別和屬性名相同的進行賦值

當我們在開發時,有時候會遇見前端傳進來的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;
    }
}