- 思路:通过自定义注解,标记需要被转换的枚举,然后扫描到它们,再利用反射转为想要的数据格式。
自定义的注解类
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DicProperties {
String NAME = "name";
String VALUE = "value";
String TITLE = "title";
String value() default "";
String[] excludes() default {};
}
转换逻辑
private List<Map<String, Object>> convertToMapList(Class<?> targetEnumClass) {
return Arrays.stream(targetEnumClass.getEnumConstants())
.filter(enumConstant -> {
String enumName = enumConstant.toString();
String[] excludeEnumNames = targetEnumClass.getAnnotation(DicProperties.class).excludes();
return !Arrays.asList(excludeEnumNames).contains(enumName);
})
.map(enumConstant -> {
Map<String, Object> map = new HashMap<>();
for (Field field : targetEnumClass.getDeclaredFields()) {
if (!field.isAnnotationPresent(DicProperties.class)) {
continue;
}
DicProperties dicProperties = field.getAnnotation(DicProperties.class);
String key = dicProperties.value();
try {
ReflectionUtils.makeAccessible(field);
key = !"".equals(key) ? key : field.getName();
Object value = field.get(enumConstant);
map.put(key, value);
} catch (IllegalAccessException e) {
log.error("枚举转换错误", e);
}
}
map.putIfAbsent(DicProperties.NAME, enumConstant.toString());
return map;
})
.collect(Collectors.toList());
}
扫描所有被注解标记的枚举类,匹配对应的那个枚举类
public List<Map<String, Object>> getEnumDicByEnumName(enumClassName) {
Set<Class<?>> classSet = new AnnotatedTypeScanner(DicProperties.class).findTypes("com.cdrundle.cdc.**.enums");
Class<?> targetEnumClass = classSet.stream()
.filter(enumClass -> enumClass.getSimpleName().equals(enumClassName))
.limit(1)
.findFirst()
.orElse(null);
if (targetEnumClass == null) {
return Collections.emptyList();
}
return convertToMapList(targetEnumClass);
}