All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.kqinfo.universal.enums.core.KqEnumScanner Maven / Gradle / Ivy

package com.kqinfo.universal.enums.core;

import com.kqinfo.universal.enums.annotation.KqEnum;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;

import java.beans.Introspector;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 扫描注解下的包
 *
 * @author Zijian Liao
 * @since 2.5.0
 */
public final class KqEnumScanner {

    private static final ResourcePatternResolver PATTERN_RESOLVER = new PathMatchingResourcePatternResolver();
    private static final MetadataReaderFactory METADATA_READER_FACTORY = new CachingMetadataReaderFactory();

    public static Map>> scanKqEnum(String basePackage) {
        Map>> enumMap = new HashMap<>(16);
        try {
            basePackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
                    ClassUtils.convertClassNameToResourcePath(basePackage) + "/**/*.class";
            final Resource[] resources = PATTERN_RESOLVER.getResources(basePackage);
            for (Resource resource : resources) {
                final MetadataReader metadataReader = METADATA_READER_FACTORY.getMetadataReader(resource);
                final AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
                AnnotationAttributes kqEnumAttrs = AnnotationAttributes
                        .fromMap(annotationMetadata.getAnnotationAttributes(KqEnum.class.getName()));
                if (kqEnumAttrs != null) {
                    final Class enumClass = ClassUtils.forName(metadataReader.getClassMetadata().getClassName(), ClassUtils.getDefaultClassLoader());
                    if (enumClass.isEnum()) {
                        // 字典名称
                        String enumName = kqEnumAttrs.getString("value");
                        if (StringUtils.isEmpty(enumName)) {
                            enumName = Introspector.decapitalize(enumClass.getSimpleName());
                        }
                        enumMap.put(enumName, (Class>) enumClass);
                    }
                }
            }
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        return enumMap;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy