Java 扫描某包下所有类的注解并获得注解值

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

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

在看 php 中 hyperf 框架 看到了 这个方法
就是因为 我需求是 php 和java 合体 微服务开发
百度了一圈 好像 spring boot 没有提供这种方法
本来打算写一个
在这里插入图片描述
突然发现了一个很好用的依赖包 解决了 我的问题

<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;}
}

嘎嘎好用!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/291144.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云亮相KubeCon EU 2024,以持续开源创新开启智能时代

3月21日&#xff0c;在巴黎举办的云原生顶级峰会KubeCon EU 2024上 &#xff0c;华为云首席架构师顾炯炯在“Cloud Native x AI&#xff1a;以持续开源创新开启智能时代”的主题演讲中指出&#xff0c;云原生和AI技术的融合&#xff0c;是推动产业深刻变革的关键所在。华为云将…

GAMES Webinar 288-VR/AR专题-陆峰-混合现实中的多模态自然人机交互

感知交互增强智能 研究室虚拟现实技术与系统国家重点实验室&#xff0c;北京航空航天大学计算医学研究所&#xff0c;大数据精准医疗北京市高精尖创新中心 Perception & Hybrid Interaction (PHI) for Augmented & Affective Intelligence (A2I) We are working on v…

【微服务】Gateway

文章目录 1.基本介绍官方文档&#xff1a;https://springdoc.cn/spring-cloud-gateway/#gateway-starter1.引出网关2.使用网关服务架构图3.Gateway网络拓扑图&#xff08;背下来&#xff09;4.Gateway特性5.Gateway核心组件1.基本介绍2.断言3.过滤 6.Gateway工作机制 2.搭建Gat…

FastAPI+React全栈开发08 安装MongoDB

Chapter02 Setting Up the Document Store with MongoDB 08 Installing MongoDB and friends FastAPIReact全栈开发08 安装MongoDB The MongoDB ecosystem is composed of different pieces of software, and I remember that when I was starting to play with it, there w…

fzf 命令行工具 - 终端模糊搜索

1. 介绍 fzf 命令行工具 Github 仓库&#xff1a;GitHub - junegunn/fzf: :cherry_blossom: A command-line fuzzy finder fzf 是一款使用 go 语言编写的交互式命令行工具&#xff0c;有着 “命令行模糊搜索神器” 的美称 可以用于文件列表、历史命令、命令输出结果等模糊搜索…

kubernetes(K8S)学习(七):K8S之系统核心组件

K8S之系统核心组件 K8s系统核心组件1.1 Master和Node1.2 kubeadm1.3 先把核心组件总体过一遍1.4 Kubernetes源码查看方式1.5 kubectl1.6 API Server1.7 集群安全机制之API Server1.8 Scheduler1.9 kubelet1.10 kube-proxy K8s系统核心组件 1.1 Master和Node 官网 &#xff1a;…

Java虚拟机(JVM)知识点总结

一. Java内存区域 1. JVM的内存区域划分&#xff0c;以及各部分的作用 可分为运行时数据区域和本地内存&#xff0c;按照线程私有和线程共享分类&#xff1a; 线程私有&#xff1a;程序计数器、虚拟机栈、本地方法栈。 线程共享&#xff1a;堆、方法区、直接内存。 JDK1.7…

vant2调用Dialog、Toast报错 is not defined

报错 ReferenceError: Dialog is not defined 照着官方文档&#xff0c;运行会报错 经过测试发现 main.js并不需要引入Dialog,而是在具体组件中单独引入即可&#xff0c;确实挺坑的&#xff01;记录一下&#xff01;&#xff01;&#xff01;

SpringBoot实现RabbitMQ延迟队列

RabbitMQ实现延迟队列的两种方式 利用RabbitMQ插件方式实现延迟队列利用RabbitMQ死信队列实现延迟队列 插件方式实现延迟队列 下载插件&#xff1a;Community Plugins | RabbitMQ 按照官网步骤安装插件 installing Additional Plugins | RabbitMQ 插件方式实现延迟队列&a…

element-ui-plus el-tree 树形结构如何自定义内容

element-ui-plus el-tree 树形结构如何自定义内容 本文提及的 elementUI 版本 为 elementUI Plus 版本 一、需求 项目中遇到一个需要设置权限的地方&#xff0c;但目录和权限是放在一起的&#xff0c;这样就很不好区分类别&#xff0c;为了区分类别&#xff0c;就需要自定义树…

【C语言】结构体详解 (二) 内存函数、结构体传参

目录 1、 结构体的内存对齐 1.1、对齐规则 1.2、练习1、练习2&#xff08;演示对齐规则1、2、3、4&#xff09; 2、为什么存在内存对齐 2.1、平台原因&#xff08;移植原因&#xff09; 2.2、性能原因 2.3、那么如何即满足对齐&#xff0c;又要节省空间呢&#xff1f; …

【Vue3源码学习】— CH2.5 reactiveEffect.ts:Vue 3响应式系统的核心

reactiveEffect.ts&#xff1a;Vue 3响应式系统的核心 1. 什么是 reactiveEffect&#xff1f;2. 核心机制2.1 依赖收集&#xff08;Track&#xff09;2.2 触发更新&#xff08;Trigger&#xff09;2.3 效果范围&#xff08;effectScope&#xff09; 3. 源码解析 —— track3.1 …

卷积神经网络(CNN)——基础知识整理

文章目录 1、卷积神经网络 2、图片格式 3、图片卷积运算 4、Kernel 与 Feature Map 5、padding/边缘填充 6、Stride/步长 7、pooling/池化 8、shape 9、epoch、batch、Batch Size、step 10、神经网络 11、激活函数 1、卷积神经网络 既然叫卷积神经网络&#xff0c;这里面首先是…

4、Cocos Creator 动画系统

目录 1、Clip 参数 2、动画编辑器 3、基本操作 更改时间轴缩放比例 移动显示区域 更改当前选中的时间轴节点 播放 / 暂停动画 修改 clip 属性 快捷键 4、模拟实验 5、动画事件 6、注意事项 参考 Animation 组件是节点上的一个组件。Clip 动画剪辑就是一份动画的声…

67、yolov8目标检测和旋转目标检测算法部署Atlas 200I DK A2开发板上

基本思想&#xff1a;需求部署yolov8目标检测和旋转目标检测算法部署atlas 200dk 开发板上 一、转换模型 链接: https://pan.baidu.com/s/1hJPX2QvybI4AGgeJKO6QgQ?pwdq2s5 提取码: q2s5 from ultralytics import YOLO# Load a model model YOLO("yolov8s.yaml")…

物流监控升级,百递云·API开放平台助力某电商平台实现高效物流管理

不论是电商平台自身还是消费者&#xff0c;都有着对物流监控的强烈需求。 消费者下单后be like: 每十分钟看一次快递轨迹 放心&#xff0c;电商平台也一样关心物流状态&#xff01;怎样第一时间向用户传递物流状态&#xff1f; 怎么减少重复的提问和投诉&#xff1f;怎样监管…

Collection与数据结构 顺序表与ArrayList

1. 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列… 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。但是在…

【Docker】搭建强大的Nginx可视化配置工具 - nginxWebUI

【Docker】搭建强大的Nginx可视化配置工具 - nginxWebUI 前言 本教程基于绿联的NAS设备DX4600 Pro的docker功能进行搭建。 简介 NginxWebUI是一个基于Java的&#xff0c;专门用来管理Nginx的图形界面工具。它是开源的&#xff0c;使用相对简单且功能全面。 使用NginxWebUI…

接劳巴,拔掉KL15,MCU重启。不接劳巴,拔掉KL15,MCU正常下电

最近遇到一个神奇的现象&#xff0c;在调试一个单KL15的项目&#xff0c;发现接着劳特巴赫调试器&#xff0c;然后拔掉KL15&#xff0c;软件进入了重启Reset函数&#xff0c;没有进入期望的下电SwitchOff函数。 而不接劳特巴赫&#xff0c;拔掉KL15&#xff0c;观测电流&#…

Qt实现Kermit协议

1 概述 Kermit文件运输协议提供了一条从大型计算机下载文件到微机的途径。它已被用于进行公用数据传输。 其特性如下: Kermit文件运输协议是一个半双工的通信协议。它支持7位ASCII字符。数据以可多达96字节长度的可变长度的分组形式传输。对每个被传送分组需要一个确认。Kerm…