Spring获取包下的所有.class文件,匹配自定义注解返回Class实体

自定义注解

package com.wxk.springcloud.test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Hello {

    String name() default "";;
}

@Target(注解的作用目标)
@Target(ElementType.TYPE):接口、类、枚举
@Target(ElementType.FIELD):字段、枚举的常量
@Target(ElementType.METHOD) :方法
@Target(ElementType.PARAMETER):方法参数
@Target(ElementType.CONSTRUCTOR):构造函数
@Target(ElementType.LOCAL_VARIABLE):局部变量
@Target(ElementType.ANNOTATION_TYPE):注解
@Target(ElementType.PACKAGE) :包

@Retention(注解的作用范围)
@Retention(RetentionPolicy.SOURCE):表示注解只保留在源文件,当java文件编译成class文件,就会消失。
@Retention(RetentionPolicy.CLASS):注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期。
@Retention(RetentionPolicy.RUNTIME):注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在。

测试类添加注解

package com.wxk.springcloud.test;

@Hello(name = "你好")
public class HelloWorld {
 
}

工具类

import com.wxk.springcloud.test.Hello;
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.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.util.ClassUtils;

import java.util.HashMap;
import java.util.Map;

public class TestUtil {

    private final static String RESOURCE_PATTERN = "/**/*.class";
    /**
     * 通过包名获取项目包下所有类
     * @param BASE_PACKAGE 包名
     * @return
     */
    public static Map<String, Class> getObject(String BASE_PACKAGE, String annotationName) {
        Map<String, Class> handlerMap = new HashMap<String, Class>();
        //spring工具类,可以获取指定路径下的全部类
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        try {
            String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
                    ClassUtils.convertClassNameToResourcePath(BASE_PACKAGE) + RESOURCE_PATTERN;
            Resource[] resources = resourcePatternResolver.getResources(pattern);
            //MetadataReader 的工厂类
            MetadataReaderFactory readerfactory = new CachingMetadataReaderFactory(resourcePatternResolver);
            for (Resource resource : resources) {
                //用于读取类信息
                MetadataReader reader = readerfactory.getMetadataReader(resource);
                //扫描到的class
                String classname = reader.getClassMetadata().getClassName();
                Class<?> clazz = Class.forName(classname);
                //判断是否有指定主解
                Hello anno = clazz.getAnnotation(Hello.class);
                if (anno != null && anno.name().equals(annotationName)) {
                    //将注解中的项目表名作为key,对应的类作为 value
                    handlerMap.put(annotationName, clazz);
                }
            }
        } catch (Exception e) {
        }
        return handlerMap;
    }

    public static void main(String[] args) {
    	//传入类的包路径和类注解的值
        Map<String, Class> map = TestUtil.getObject("com.wxk.springcloud.test", "你好");
        System.out.println(map);
    }
}

测试结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值