扫描获取项目里的所有枚举

依赖的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;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值