当列表页字段很多,同时状态码很多,在代码里面进行繁琐的替换,于是就想使用自定义注解,实现实体类替换状态码,使用反射,寻找实体类中的字段,进行识别注解,然后进行替换值。话不多说,直接上代码
需要注意的是使用了复注解,所以需要额外注意下
父注解:
/**
- 用来替换很多字典中的状态码
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface DictValueConverts {
// 用于支持重复使用注解
DictValueConvert[] value();
}
子注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Repeatable(DictValueConverts.class) // 添加 @Repeatable 元注解,用来指定哪个容器进行重复使用
public @interface DictValueConvert {
// 状态码
String value();
// 要替换的具体值
String replaceValue();
}
实体类示例
@DictValueConverts({
@DictValueConvert(value = “1” ,replaceValue = “计算1”),
@DictValueConvert(value = “2” ,replaceValue = “计算2”)
})
private String type;
/**
* 替换字典值
* @param entity
*/
private static void replaceFieldValuesUsingAnnotations(ResEquipmentEntity entity) {
Field[] fields = entity.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(DictValueConverts.class)) {
// 因为重复使用注解,所以需要找到父注解下的子注解
DictValueConverts dictValueConverts = field.getAnnotation(DictValueConverts.class);
String fieldValue = getFieldValue(entity, field);
DictValueConvert[] dictValueConvertArray = dictValueConverts.value();
for(DictValueConvert dictValueConvert : dictValueConvertArray){
if (dictValueConvert.value().equals(fieldValue)) {
setFieldValue(entity, field, dictValueConvert.replaceValue());
}
}
}
}
}
// 得到字段信息
private static String getFieldValue(Object entity, Field field) {
field.setAccessible(true);
try {
return (String) field.get(entity);
} catch (IllegalAccessException e) {
e.printStackTrace();
return null;
}
}
//重新进行赋值
private static void setFieldValue(Object entity, Field field, String value) {
field.setAccessible(true);
try {
field.set(entity, value);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}