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

