背景 : 需求 需要获取某个包下的所有的注解 并不是全部项目的
所以 只用针对某个包 进行扫描 获取注解 数据就行

百度了一圈 spring boot 没有自带的 获取注解集合的方法

在看 php 中 hyperf 框架 看到了 这个方法
就是因为 我需求是 php 和java 合体 微服务开发
百度了一圈 好像 spring boot 没有提供这种方法
本来打算写一个
Java 扫描某包下所有类的注解并获得注解值-LMLPHP
突然发现了一个很好用的依赖包 解决了 我的问题

<dependency>
            <groupId>org.reflections</groupId>
            <artifactId>reflections</artifactId>
            <version>0.10.2</version>
        </dependency>

这个reflections 包 主要作用是

这个依赖是用于 Java 项目中的反射操作的。org.reflections 是一个 Java 库,允许你在运行时查找和使用类、方法、字段等。它提供了一种简单的方式来扫描你的项目或者外部库中的类和注解,从而帮助你进行一些动态的操作,比如查找特定的类、方法或者注解,或者执行特定的操作。

详细用法 自行百度
我的需求 做法 代码如下

package com.init.utils;

import com.api.exception.KuaiJingRuntimeException;

import org.reflections.Reflections;
import org.reflections.scanners.MethodAnnotationsScanner;
import org.reflections.util.ClasspathHelper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import org.reflections.util.ConfigurationBuilder;
import org.springframework.web.bind.annotation.RequestMapping;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * User:Json
 * Date: 2024/3/29
 * 扫描包 工具类
 **/
@Component
public class ScanPackageUtils {

    @Value("${spring.application.name}")
    private  String serviceName;

    //获取 某个包下的类上的 指定注解  信息
    public <T extends Annotation> List<T> getPackageClassAnnotationList(String packageName,Class<T> annotationClass) {

        // 反射
        Reflections ref = new Reflections(packageName);
        // 获取扫描到的标记注解的集合
        Set<Class<?>> set = ref.getTypesAnnotatedWith((Class<? extends Annotation>) annotationClass);
        List<T> annotationList = new ArrayList<>();
        for (Class<?> c : set) {
            // 循环获取标记的注解
            T annotation = (T) c.getAnnotation(annotationClass);
            annotationList.add(annotation);
        }
        return annotationList;
    }

    //获取 某个包下所有类下的 方法上的 指定注解  信息
    public <T extends Annotation> List<T> getPackageMethodAnnotationList(String packageName,Class<T> annotationClass) {

        Reflections reflections = new Reflections(new ConfigurationBuilder().setUrls(ClasspathHelper.forPackage(packageName)).setScanners(new MethodAnnotationsScanner()));
        Set<Method> methods = reflections.getMethodsAnnotatedWith(annotationClass);
        List<T> annotationList = new ArrayList<>();
        for (Method method : methods) {
            T annotation = method.getAnnotation(annotationClass);
            if (annotation != null) {
                annotationList.add(annotation);
            }
        }
        return annotationList;
    }

    // 返回完整的 包名
    /***
     *  suffixPackage 包结尾名
     * */
    public   String getServicePackageName(String suffixPackage) {
        String serviceNameStr="";
        // 去掉 "-service" 后缀
        if (serviceName.endsWith("-service")) {
            serviceNameStr = serviceName.substring(0, serviceName.lastIndexOf("-service"));
        }
        if(StringUtils.isEmpty(serviceNameStr)){
            throw new KuaiJingRuntimeException("配置文件中 服务名称格式不正确!");
        }
        return "com.xxx."+serviceNameStr+"."+suffixPackage;
    }
}

嘎嘎好用!!!

03-30 20:21