91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java反射機制Reflection在項目中的應用

發布時間:2020-08-28 19:21:14 來源:網絡 閱讀:3883 作者:it林工 欄目:編程語言

反射機制Reflection 簡單的理解就是對class類的運用,在項目當中,適用于很多獨特的場景,比如我們項目中的需求,1 我這邊有兩條數據,我主要知道兩條數據哪些字段做了變更;2 我們跟別的webServer做聯調,適配推送過去的字段等等。

1 幾個注意核心類和方法
  • Field : 提供有關類或接口的單個字段的信息和動態訪問。
    getName() :返回此Field對象表示的字段的名稱.
    getType(): 返回一個Class對象,該對象標識此Field對象表示的字段的聲明類型 。
  • getDeclaredField(String name) : 返回一個Field對象。
  • getDeclaredFields() :返回一個Field數組
  • 當然用的的不止這些,具體看業務和Class 文檔
2 生成公共類
public class Conversion {    
????//將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;
    }
}
3 項目實踐:
  • 3.1需求1 :我這邊有兩條數據,我想知道知道兩條數據哪些字段做了變更【通過遍歷,查出字段name相同的字段的value是否相同,記錄下來,返回到List<Map<String, Object>> 集合中,接下來你就可以拿著這個結合做各種業務處理了】
    // 這邊比較數據的值
    public List<Map<String, Object>> getCompareData(HecYbMedCodeSyncEntity entityHis, HecYbMedCodeSyncEntity entityNow) {
        List<Map<String, Object>> lists = new ArrayList<>();
        List<Map<String, Object>> modelList = Conversion.getFiledInfo(entityHis);
        List<Map<String, Object>> entityList = Conversion.getFiledInfo(entityNow);
        modelList.forEach(mapHis -> {
            entityList.forEach(mapNow -> {
                Map<String, Object> map = new HashMap<>();               
                //這邊需要把獲取得到的字段名 跟 醫保中心的字段名做個匹配,把我們這邊的字段名轉成他們那邊的字段名
                if ( mapHis.get("name").toString().equals(mapNow.get("name").toString())) {//判斷名字相同                    
                    if (!(mapHis.get("value").toString().equals(mapNow.get("value").toString())) ) {//判斷值不相同 且 反射實體不為空
                        map.put("bgzdbm", fieldMappedEnum.getSourceFieldName()); //變更字段編碼
                        map.put("bgzdmc", fieldMappedEnum.getDesc()); //變更字段名稱
                        map.put("bgqz00", mapHis.get("value").toString()); //變更前值
                        map.put("bghz00", mapNow.get("value").toString()); //變更后值                        
                        map.put("bgsj00", DateUtil.limitDay(entityNow.getSyncTime())); //變更時間
                        lists.add(map);
                    }
                }
            });
        });
  • 3.2 我們跟別的webServer做聯調,我需要把我的數據庫字段的名稱改成webServer上的值。

    我的設計思路是,設計一個枚舉,把我數據庫的字段A,和webServer接口上的字段對應上B,這樣給B賦值的時候就可以通過枚舉獲取得到A,并且通過A就可以獲取到A的值,這樣就繞過了人工的給B賦值的繁瑣操作。
    Java反射機制Reflection在項目中的應用

調用如下:

FieldMappedEnum fieldMappedEnum = FieldMappedEnum.findSourceFieldByTarget(mapHis.get("name").toString());
map.put("bgzdbm", fieldMappedEnum.getSourceFieldName()); //變更字段編碼
map.put("bgzdmc", fieldMappedEnum.getDesc()); //變更字段名稱
....
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

荔波县| 平度市| 鹤壁市| 贵南县| 南阳市| 会昌县| 临夏县| 玉环县| 连南| 沅江市| 长汀县| 揭西县| 乌兰县| 大石桥市| 罗田县| 淳化县| 兴海县| 育儿| 肥乡县| 平定县| 法库县| 曲阳县| 社会| 玉田县| 青龙| 巴楚县| 会泽县| 玉环县| 东城区| 广州市| 德惠市| 长寿区| 阿拉善左旗| 法库县| 襄城县| 滦平县| 微山县| 嘉黎县| 灵石县| 南丹县| 恭城|