欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java反射機(jī)制Reflection在項(xiàng)目中的應(yīng)用

反射機(jī)制Reflection 簡(jiǎn)單的理解就是對(duì)class類(lèi)的運(yùn)用,在項(xiàng)目當(dāng)中,適用于很多獨(dú)特的場(chǎng)景,比如我們項(xiàng)目中的需求,1 我這邊有兩條數(shù)據(jù),我主要知道兩條數(shù)據(jù)哪些字段做了變更;2 我們跟別的webServer做聯(lián)調(diào),適配推送過(guò)去的字段等等。

1 幾個(gè)注意核心類(lèi)和方法
  • Field : 提供有關(guān)類(lèi)或接口的單個(gè)字段的信息和動(dòng)態(tài)訪(fǎng)問(wèn)。
    getName() :返回此Field對(duì)象表示的字段的名稱(chēng).
    getType(): 返回一個(gè)Class對(duì)象,該對(duì)象標(biāo)識(shí)此Field對(duì)象表示的字段的聲明類(lèi)型 。
  • getDeclaredField(String name) : 返回一個(gè)Field對(duì)象。
  • getDeclaredFields() :返回一個(gè)Field數(shù)組
  • 當(dāng)然用的的不止這些,具體看業(yè)務(wù)和Class 文檔
2 生成公共類(lèi)
public class Conversion {    
????//將model中與entity中類(lèi)型和名稱(chēng)相同的屬性值賦值給對(duì)應(yīng)的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) {
                /**
                 * 判斷類(lèi)型和屬性名是否都相同
                 */
                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) {//查看其父類(lèi)屬性
                        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類(lèi)型轉(zhuǎn)換錯(cuò)誤 " + ex);
                        }
                    }
                }
            }
        }
        return entity;
    }

    /**
     * 根據(jù)屬性名獲取屬性值
     */
    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;
        }
    }

    /**
     * 獲取屬性名數(shù)組
     */
    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;
    }

    /**
     * 獲取屬性類(lèi)型(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()));

        /**
         * 如果存在父類(lèi),獲取父類(lèi)的屬性值,類(lèi)型,名稱(chēng)并添加到一起
         */
        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 項(xiàng)目實(shí)踐:
  • 3.1需求1 :我這邊有兩條數(shù)據(jù),我想知道知道兩條數(shù)據(jù)哪些字段做了變更【通過(guò)遍歷,查出字段name相同的字段的value是否相同,記錄下來(lái),返回到List<Map<String, Object>> 集合中,接下來(lái)你就可以拿著這個(gè)結(jié)合做各種業(yè)務(wù)處理了】
    // 這邊比較數(shù)據(jù)的值
    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<>();               
                //這邊需要把獲取得到的字段名 跟 醫(yī)保中心的字段名做個(gè)匹配,把我們這邊的字段名轉(zhuǎn)成他們那邊的字段名
                if ( mapHis.get("name").toString().equals(mapNow.get("name").toString())) {//判斷名字相同                    
                    if (!(mapHis.get("value").toString().equals(mapNow.get("value").toString())) ) {//判斷值不相同 且 反射實(shí)體不為空
                        map.put("bgzdbm", fieldMappedEnum.getSourceFieldName()); //變更字段編碼
                        map.put("bgzdmc", fieldMappedEnum.getDesc()); //變更字段名稱(chēng)
                        map.put("bgqz00", mapHis.get("value").toString()); //變更前值
                        map.put("bghz00", mapNow.get("value").toString()); //變更后值                        
                        map.put("bgsj00", DateUtil.limitDay(entityNow.getSyncTime())); //變更時(shí)間
                        lists.add(map);
                    }
                }
            });
        });
  • 3.2 我們跟別的webServer做聯(lián)調(diào),我需要把我的數(shù)據(jù)庫(kù)字段的名稱(chēng)改成webServer上的值。

    我的設(shè)計(jì)思路是,設(shè)計(jì)一個(gè)枚舉,把我數(shù)據(jù)庫(kù)的字段A,和webServer接口上的字段對(duì)應(yīng)上B,這樣給B賦值的時(shí)候就可以通過(guò)枚舉獲取得到A,并且通過(guò)A就可以獲取到A的值,這樣就繞過(guò)了人工的給B賦值的繁瑣操作。
    Java反射機(jī)制Reflection在項(xiàng)目中的應(yīng)用

    成都一家集口碑和實(shí)力的網(wǎng)站建設(shè)服務(wù)商,擁有專(zhuān)業(yè)的企業(yè)建站團(tuán)隊(duì)和靠譜的建站技術(shù),十年企業(yè)及個(gè)人網(wǎng)站建設(shè)經(jīng)驗(yàn) ,為成都上千余家客戶(hù)提供網(wǎng)頁(yè)設(shè)計(jì)制作,網(wǎng)站開(kāi)發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營(yíng)銷(xiāo)型網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),同時(shí)也為不同行業(yè)的客戶(hù)提供成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機(jī)械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選創(chuàng)新互聯(lián)。

調(diào)用如下:

FieldMappedEnum fieldMappedEnum = FieldMappedEnum.findSourceFieldByTarget(mapHis.get("name").toString());
map.put("bgzdbm", fieldMappedEnum.getSourceFieldName()); //變更字段編碼
map.put("bgzdmc", fieldMappedEnum.getDesc()); //變更字段名稱(chēng)
....

當(dāng)前標(biāo)題:Java反射機(jī)制Reflection在項(xiàng)目中的應(yīng)用
轉(zhuǎn)載注明:http://aaarwkj.com/article32/jjgopc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、做網(wǎng)站、App設(shè)計(jì)、靜態(tài)網(wǎng)站搜索引擎優(yōu)化、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
欧美精品黑人三级精品| 老司机精品成人免费视频| 午夜av在线毛片免费观看| 少妇视频资源一区二区三区 | 亚洲少妇插进去综合网| 日本又色又爽又黄的观看| 高清中文字幕一区二区三区| 毛片一区二区三区免费看| 中文字幕不卡在线观看不卡| 日本理论高清在线观看| 亚洲欧美成人自偷自拍一区| 国产91对白在线观看| 亚洲欧洲国产视频一区二区| 日本中文字幕一二三四区| 精品人妻中文字幕一区有码| 国产激情一区二区三区不卡| 国内精品人妻在线中文字幕| 中文字幕制服日韩久久一区| 91久久精品中文字幕| 日本高清免费观看一区| 香婷婷一区二区精品久久| 国产精品国产亚洲精品看不| 中文字幕五月婷婷免费| 国产黄片自拍视频免费看| 歪歪私人影院午夜毛片| 中文字幕午夜av福利| 亚洲国产成人不卡高清麻豆| 日本在线一区二区三区| 亚洲无人区码一码二码三码| 日韩av高清不卡一区二区三区| 超碰av之男人的天堂| 亚洲香蕉av在线一区二区三区 | 国产成十人十综合十亚洲| 日韩免费在线观看av| 国产精品伦理一区二区三区| 久久久久久成人亚洲| av二区不卡国产精品| 蜜臀av在线精品国自产拍| 久热伊人精品国产中文| 日韩国产精品一区二区| 国产精品一区二区婷婷|