欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java使用自定義注解+反射實(shí)現(xiàn)字典轉(zhuǎn)換代碼實(shí)例

 更新時(shí)間:2023年09月23日 08:28:42   作者:也曾眼眸有光  
這篇文章主要介紹了Java使用自定義注解+反射實(shí)現(xiàn)字典轉(zhuǎn)換代碼實(shí)例,注解是一種能被添加到j(luò)ava代碼中的元數(shù)據(jù),類、方法、變量、參數(shù)和包都可以用注解來修飾,注解對(duì)于它所修飾的代碼并沒有直接的影響,需要的朋友可以參考下

一、自定義注解類

import java.lang.annotation.*;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Dict {
    /**
     * 字典編碼
     */
    String dictName();
    /**
     * 實(shí)體類內(nèi)對(duì)應(yīng)的中文字段名,默認(rèn)為“當(dāng)前字段+Text”
     * <p>
     * 例如當(dāng)前字段為“type”,則對(duì)應(yīng)中文字段默認(rèn)為“typeText”
     */
    String dictField() default "";
}

二、AOP切面類

也可不使用切面,定義工具類進(jìn)行處理

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Slf4j
@Aspect
@Component
public class DictAspect {
    @Pointcut("execution(* cn.stylefeng.guns.sys.modular.mapper.*.query*(..))") //指定mapper下所有查詢方法
    public void doPointcut() {
    }
    @AfterReturning(pointcut = "doPointcut()", returning = "result")
    public void doAfterReturning(JoinPoint pjp, Object result) {
        try {
            DictUtils.convertDict(result);
        } catch (Exception e) {
            log.error("查詢結(jié)果字典轉(zhuǎn)換失敗", e);
        }
    }
}

三、字典轉(zhuǎn)換工具類

package cn.hsa.powersi.hygeia.pcloud.DictConverUtils;
import cn.hsa.powersi.hygeia.pcloud.api.basic.iteminfo.Dict;
import cn.hsa.powersi.hygeia.pcloud.api.sys.dto.SysCodeTableDetailDTO;
import cn.hsa.powersi.hygeia.pcloud.basic.itemOwnType.dao.PhcItemTypeDAO;
import cn.hsa.powersi.hygeia.pcloud.basic.itemOwnType.entity.PhcItemTypeDO;
import cn.hsa.powersi.hygeia.pcloud.basic.storeseat.dao.PhcStoreSeatDAO;
import cn.hsa.powersi.hygeia.pcloud.basic.storeseat.entity.PhcStoreSeatDO;
import cn.hsa.powersi.hygeia.pcloud.com.base.dto.SelectDTO;
import cn.hsa.powersi.hygeia.pcloud.comm.bo.BasDictBO;
import cn.hsa.powersi.hygeia.pcloud.sys.bo.SysCodeTableDetailBO;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.Data;
import lombok.SneakyThrows;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ClassUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * @ClassName DictUtils
 * @Description  轉(zhuǎn)碼工具類  需要在DTO中使用注解進(jìn)行轉(zhuǎn)碼
 * @Author 陳銳
 * @Date 2023/8/21 10:32
 * @Version 1.0
 */
@Component
public class DictUtils {
    private static  SysCodeTableDetailBO sysCodeTableDetailBO;
    @Resource
    public void setSysCodeTableDetailBO(SysCodeTableDetailBO sysCodeTableDetailBO) {
        DictUtils.sysCodeTableDetailBO = sysCodeTableDetailBO;
    }
    private static final String DICT_FIELD_SUFFIX = "Name";
    public static void convertDict(Object target) {
        if (target instanceof List) {
            List<?> objectList = ((List<?>) target);
            if (CollectionUtils.isNotEmpty(objectList)) {
                List<DictDefinition> dictDefinitions = getMetadata(objectList.get(0));
                if (CollectionUtils.isEmpty(dictDefinitions)) return;
                Map<String, Map<String, String>> dictMapMap = getCodeTable();
                objectList.forEach(t -> doConvertDict(t, dictDefinitions, dictMapMap));
            }
        } else {
            List<DictDefinition> dictDefinitions = getMetadata(target);
            if (CollectionUtils.isEmpty(dictDefinitions)) return;
            Map<String, Map<String, String>> dictMapMap = getCodeTable();
            doConvertDict(target, dictDefinitions, dictMapMap);
        }
    }
    /**
     * 僅獲取一次Dict元數(shù)據(jù),降低多次反射造成的性能消耗
     * @param target 目標(biāo)實(shí)體類
     * @return Dict元數(shù)據(jù)
     */
    private static List<DictDefinition> getMetadata(Object target) {
        List<DictDefinition> dictDefinitions = new ArrayList<>();
        if (ClassUtils.isPrimitiveOrWrapper(target.getClass())
                || target instanceof Map || target instanceof String) {
            return dictDefinitions;
        }
        List<Field> fields = FieldUtils.getAllFieldsList(target.getClass());
        for (Field field : fields) {
            Dict dict = AnnotationUtils.getAnnotation(field, Dict.class);
            if (dict != null) {
                DictDefinition dictDefinition = new DictDefinition();
                dictDefinition.setDict(dict);
                dictDefinition.setField(field);
                dictDefinitions.add(dictDefinition);
            }
        }
        return dictDefinitions;
    }
    @SneakyThrows
    private static void doConvertDict(Object target, List<DictDefinition> dictDefinitions,
                                      Map<String, Map<String, String>> dictMapMap) {
        for (DictDefinition dictDefinition : dictDefinitions) {
            Dict dict = dictDefinition.getDict();
            Field field = dictDefinition.getField();
            Map<String, String> dictMap = dictMapMap.get(dict.dictName());
            String dictCode = String.valueOf(FieldUtils.readField(target, field.getName(), true));
            String dictField = StringUtils.isEmpty(dict.dictField()) ? field.getName() + DICT_FIELD_SUFFIX : dict.dictField();
            FieldUtils.writeField(target, dictField, dictMap.get(dictCode), true);
        }
    }
    @Data
    public static class DictDefinition {
        private Dict dict;
        private Field field;
    }
    //獲取碼表
    public static Map<String, Map<String, String>> getCodeTable(List<String> shopIdList){
        ArrayList<String> codeTypeList = new ArrayList<>();
        return codeTypeMap;
    }
}

四、VO中使用注解確定需要字典轉(zhuǎn)換的字段

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class TestVo {
    private Integer id;
    private String name;
    private String idCard;
    /**
     * 性別(0、未知的性別 1、男性 2、女性)
     */
    @Dict(dictName = "sex")
    private String sex;
	//字典翻譯后的中文會(huì)賦值到該字段上面
    private String sexName;
}

到此這篇關(guān)于Java使用自定義注解+反射實(shí)現(xiàn)字典轉(zhuǎn)換代碼實(shí)例的文章就介紹到這了,更多相關(guān)自定義注解+反射實(shí)現(xiàn)字典轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java基于JDBC實(shí)現(xiàn)事務(wù),銀行轉(zhuǎn)賬及貨物進(jìn)出庫功能示例

    Java基于JDBC實(shí)現(xiàn)事務(wù),銀行轉(zhuǎn)賬及貨物進(jìn)出庫功能示例

    這篇文章主要介紹了Java基于JDBC實(shí)現(xiàn)事務(wù),銀行轉(zhuǎn)賬及貨物進(jìn)出庫功能,較為詳細(xì)的分析了事務(wù)操作的原理、實(shí)現(xiàn)方法及java基于jdbc連接數(shù)據(jù)庫實(shí)現(xiàn)銀行事務(wù)操作的相關(guān)技巧,需要的朋友可以參考下
    2017-12-12
  • intellij idea配置外部dtd文件的方法

    intellij idea配置外部dtd文件的方法

    這篇文章主要介紹了intellij idea配置外部dtd文件的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09
  • log4j的配置文件詳細(xì)解析

    log4j的配置文件詳細(xì)解析

    以下小編主要為大家介紹一下log4j的配置文件各個(gè)配置項(xiàng)的含義。需要的朋友可以過來參考下
    2013-08-08
  • Spring Cloud Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡的示例

    Spring Cloud Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡的示例

    本篇文章主要介紹了Spring Cloud Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • Java中的動(dòng)態(tài)代理原理及實(shí)現(xiàn)

    Java中的動(dòng)態(tài)代理原理及實(shí)現(xiàn)

    這篇文章主要介紹了Java中的動(dòng)態(tài)代理原理及實(shí)現(xiàn),動(dòng)態(tài)是相對(duì)于靜態(tài)而言,何為靜態(tài),即編碼時(shí)手動(dòng)編寫代理類、委托類,而動(dòng)態(tài)呢,是不編寫具體實(shí)現(xiàn)類,等到使用時(shí),動(dòng)態(tài)創(chuàng)建一個(gè)來實(shí)現(xiàn)代理的目的,需要的朋友可以參考下
    2023-12-12
  • java實(shí)現(xiàn)三角形分形山脈

    java實(shí)現(xiàn)三角形分形山脈

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)三角形分形山脈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 如何通過Java代碼實(shí)現(xiàn)KMP算法

    如何通過Java代碼實(shí)現(xiàn)KMP算法

    這篇文章主要介紹了如何通過Java代碼實(shí)現(xiàn)KMP算法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java判斷字符串回文的代碼實(shí)例

    Java判斷字符串回文的代碼實(shí)例

    在本篇文章里小編給各位整理的是一篇關(guān)于Java判斷字符串回文的代碼實(shí)例內(nèi)容,需要的朋友們可以跟著學(xué)習(xí)參考下。
    2020-02-02
  • Java SPEL表達(dá)式注入漏洞原理解析

    Java SPEL表達(dá)式注入漏洞原理解析

    SpEL簡稱Spring表達(dá)式語言,在Spring 3中引入,SpEL能在運(yùn)行時(shí)構(gòu)建復(fù)雜表達(dá)式、存取對(duì)象圖屬性、對(duì)象方法調(diào)用等等,可以與基于XML和基于注解的Spring配置還有bean定義一起使用,本文給大家介紹Java SPEL表達(dá)式注入漏洞原理研究,感興趣的朋友一起看看吧
    2023-10-10
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單鏈表與雙向鏈表

    java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單鏈表與雙向鏈表

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)單鏈表、雙向鏈表的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論