依赖的jar包:
implementation 'org.springframework:spring-context:6.0.3'
实现代码:
import com.star.platform.annotation.EnumDescAnnotation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AssignableTypeFilter;
import java.lang.reflect.Method;
import java.util.*;
@Slf4j
public class EnumScannerUtils {
private static List<EnumDTO> enumDTOS = null;
public static List<EnumDTO> getEnumDTOS(){
if(enumDTOS == null){
enumDTOS = scanEnumValues();
}
return enumDTOS;
}
public static synchronized List<EnumDTO> scanEnumValues() {
List<EnumDTO> enumDTOS = new ArrayList<>();
// 替换成你要扫描的包路径
String packageName = "com.**.enums";
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
scanner.addIncludeFilter(new AssignableTypeFilter(Enum.class));
Set<BeanDefinition> candidateComponents = scanner.findCandidateComponents(packageName);
HashMap<String, Map<String, String>> dicData = new HashMap<>();
for (BeanDefinition candidateComponent : candidateComponents) {
String className = candidateComponent.getBeanClassName();
// log.info("enum: " + className);
try {
Class<?> enumClass = Class.forName(className);
if (isIgnore(enumClass)) {
continue;
}
if (enumClass.isEnum()) {
EnumDTO dto = new EnumDTO();
dto.setClassName(className);
dto.setSimpleName(enumClass.getSimpleName());
dto.setDesc(getEnumDescAnnotation(enumClass));
List<EnumValueDTO> enumValueDTOS = new ArrayList<>();
dto.setValues(enumValueDTOS);
Object[] enumConstants = enumClass.getEnumConstants();
for (Object enumConstant : enumConstants) {
EnumValueDTO enumValueDTO = new EnumValueDTO();
enumValueDTO.setValueName(enumConstant.toString());
enumValueDTO.setDesc(getDesc(enumConstant));
enumValueDTO.setIndex(getOrdinal(enumConstant));
enumValueDTOS.add(enumValueDTO);
}
enumDTOS.add(dto);
}
} catch (ClassNotFoundException e) {
log.info("Found enum class error: " + className, e);
}
}
log.info("get enum total num: " + enumDTOS.size());
return enumDTOS;
}
private static String getEnumDescAnnotation(Class<?> enumClass) {
EnumDescAnnotation annotation = enumClass.getAnnotation(EnumDescAnnotation.class);
if (annotation != null) {
return annotation.value();
}
return null;
}
private static boolean isIgnore(Class<?> enumClass) {
EnumDescAnnotation annotation = enumClass.getAnnotation(EnumDescAnnotation.class);
if (annotation != null) {
return annotation.ignore();
}
return false;
}
private static String getDesc(Object enumConstant) {
try {
Method getDescMethod = enumConstant.getClass().getMethod("getDesc");
return (String) getDescMethod.invoke(enumConstant);
} catch (Exception e) {
return enumConstant.toString();
}
}
private static Integer getOrdinal(Object enumConstant) {
try {
Method getDescMethod = enumConstant.getClass().getMethod("ordinal");
return (Integer) getDescMethod.invoke(enumConstant);
} catch (Exception ex) {
return null;
}
}
}
可以给枚举增加一个注解,用于增加说明和过滤某些枚举的作用:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface EnumDescAnnotation {
String value() default "";
boolean ignore() default false;
}
定义一个枚举:
@EnumDescAnnotation("状态")
public enum Status {
INVALID("失效"),
VALID("正常");
private String desc;
Status(String desc){
this.desc = desc;
}
public String getDesc() {
return desc;
}
}
389

被折叠的 条评论
为什么被折叠?



