Java使用自定義注解+反射實現(xiàn)字典轉(zhuǎn)換代碼實例
更新時間:2023年09月23日 08:28:42 作者:也曾眼眸有光
這篇文章主要介紹了Java使用自定義注解+反射實現(xiàn)字典轉(zhuǎn)換代碼實例,注解是一種能被添加到java代碼中的元數(shù)據(jù),類、方法、變量、參數(shù)和包都可以用注解來修飾,注解對于它所修飾的代碼并沒有直接的影響,需要的朋友可以參考下
一、自定義注解類
import java.lang.annotation.*; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Dict { /** * 字典編碼 */ String dictName(); /** * 實體類內(nèi)對應的中文字段名,默認為“當前字段+Text” * <p> * 例如當前字段為“type”,則對應中文字段默認為“typeText” */ String dictField() default ""; }
二、AOP切面類
也可不使用切面,定義工具類進行處理
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中使用注解進行轉(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 目標實體類 * @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; //字典翻譯后的中文會賦值到該字段上面 private String sexName; }
到此這篇關于Java使用自定義注解+反射實現(xiàn)字典轉(zhuǎn)換代碼實例的文章就介紹到這了,更多相關自定義注解+反射實現(xiàn)字典轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java基于JDBC實現(xiàn)事務,銀行轉(zhuǎn)賬及貨物進出庫功能示例
這篇文章主要介紹了Java基于JDBC實現(xiàn)事務,銀行轉(zhuǎn)賬及貨物進出庫功能,較為詳細的分析了事務操作的原理、實現(xiàn)方法及java基于jdbc連接數(shù)據(jù)庫實現(xiàn)銀行事務操作的相關技巧,需要的朋友可以參考下2017-12-12Spring Cloud Ribbon實現(xiàn)客戶端負載均衡的示例
本篇文章主要介紹了Spring Cloud Ribbon實現(xiàn)客戶端負載均衡的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02java數(shù)據(jù)結(jié)構(gòu)基礎:單鏈表與雙向鏈表
這篇文章主要為大家詳細介紹了java實現(xiàn)單鏈表、雙向鏈表的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08