497. Java 反射 - 使用反射读取注解
文章目录497. Java 反射 - 使用反射读取注解1. 为什么要关心注解2. 获取注解的工具类AnnotatedElement3. 示例类级别注解4. 示例重复注解 (Repeatable Annotations)方式一通过容器注解 Validators方式二直接用 getAnnotationsByType()5. 总结497. Java 反射 - 使用反射读取注解1. 为什么要关心注解在现代 Java 开发中注解已经成为框架和库的“开关”。ORM 框架如 Hibernate、JPA用注解标记实体字段和表的映射。Spring用注解实现依赖注入、事务管理、安全控制。验证框架用注解标记参数是否允许null、是否必须符合某种格式。 注解之所以能发挥作用核心原因就是运行时通过反射 API 读取注解并执行相应逻辑。2. 获取注解的工具类AnnotatedElement以下几个反射类都实现了AnnotatedElement接口Class类、接口、枚举、记录、数组Field字段Method方法Constructor构造函数它们提供了几组关键方法isAnnotationPresent(Class?)是否存在某个注解。getAnnotations()获取该元素上的所有注解包括继承的。getDeclaredAnnotations()只获取该元素本身声明的注解。getAnnotation(Class?)获取指定类型的注解实例。getAnnotationsByType(Class?)获取重复注解。3. 示例类级别注解定义枚举和注解enumSerializedFormat{BINARY,XML,JSON}Target(ElementType.TYPE)Retention(RetentionPolicy.RUNTIME)interfaceBean{}Target(ElementType.TYPE)Retention(RetentionPolicy.RUNTIME)interfaceSerialized{SerializedFormatformat()defaultSerializedFormat.JSON;}在类上使用SerializedBeanpublicclassPerson{}通过反射读取Class?cPerson.class;booleanisBeanc.isAnnotationPresent(Bean.class);System.out.println(isBean isBean);Annotation[]annotationsc.getAnnotations();for(Annotationannotation:annotations){System.out.println(annotation annotation);}输出isBeantrueannotationorg.devjava.Serialized(formatJSON)annotationorg.devjava.Bean() 注意返回的其实是注解类的实例对象你可以直接调用它的方法。Serializedserializedc.getAnnotation(Serialized.class);System.out.println(format serialized.format());输出formatJSON4. 示例重复注解 (Repeatable Annotations)定义验证规则enumValidationRules{NON_NULL,NON_EMPTY,NON_ZERO}Target(ElementType.FIELD)Retention(RetentionPolicy.RUNTIME)interfaceValidators{Validator[]value();}Target(ElementType.FIELD)Repeatable(Validators.class)interfaceValidator{ValidationRulesvalue();}应用在Person类的字段上publicclassPerson{Validator(ValidationRules.NON_NULL)Validator(ValidationRules.NON_EMPTY)privateStringname;}读取注解方式一通过容器注解ValidatorsFieldnameFieldPerson.class.getDeclaredField(name);Annotation[]annotationsnameField.getAnnotations();Validatorsvalidators(Validators)annotations[0];for(Validatorv:validators.value()){System.out.println(validator v);}输出validatororg.devjava.Validator(NON_NULL)validatororg.devjava.Validator(NON_EMPTY)方式二直接用getAnnotationsByType()Validator[]validatorsnameField.getAnnotationsByType(Validator.class);for(Validatorv:validators){System.out.println(annotation v);}输出annotationorg.devjava.Validator(NON_NULL)annotationorg.devjava.Validator(NON_EMPTY) 第二种方式更简洁JDK 会自动帮你展开容器注解。5. 总结注解是框架的“说明书”框架通过反射读取注解来决定如何运行。类、方法、字段、构造函数都可以携带注解并通过AnnotatedElement访问。isAnnotationPresent()检查是否存在。getAnnotation()获取单个注解。getAnnotationsByType()用于重复注解。

相关新闻

PMSM无传感器控制:滑模观测器原理、Simulink仿真与参数调试实战

PMSM无传感器控制:滑模观测器原理、Simulink仿真与参数调试实战

1. 项目缘起:为什么无传感器控制是PMSM驱动的一个“坎”在电机驱动的圈子里,永磁同步电机(PMSM)凭借其高功率密度、高效率和高动态响应性能,早已成为伺服、电动汽车、工业机器人等领域的宠儿。但一个绕不开的经典难题是…

2026/10/6 9:32:36 阅读更多 →
数学建模竞赛单人作战指南:从团队协作困境到高效个人技术栈

数学建模竞赛单人作战指南:从团队协作困境到高效个人技术栈

1. 项目概述:当数学建模遇上“神仙队友”如果你是一名理工科学生,或者参加过任何形式的科创竞赛,那么“数学建模”这四个字对你来说,可能意味着熬夜、咖啡、和无穷无尽的论文与代码。但比这些更让人刻骨铭心的,往往是你…

2026/9/25 18:01:06 阅读更多 →
计算服务 基于 xxl-job 的跑批业务实践记录

计算服务 基于 xxl-job 的跑批业务实践记录

Q1:xxl-job 和 calc 自己的跑批逻辑是怎么接起来的? 入口并不复杂。BaseJobHandler 是一个抽象基类,具体任务继承它之后只负责实现业务计算。xxl-job 那边配置的 Handler 调用基类统一的调度入口后,基类会从 xxl-job 那里拿到调度…

2026/10/13 3:43:26 阅读更多 →

最新新闻

免费 Win11 与 Office 激活指南:MAS 脚本 4 种方式一键完成

免费 Win11 与 Office 激活指南:MAS 脚本 4 种方式一键完成

免费 Win11 与 Office 激活指南:MAS 脚本 4 种方式一键完成 【免费下载链接】Microsoft-Activation-Scripts Open-source Windows and Office activator featuring HWID, Ohook, TSforge, and Online KMS activation methods, along with advanced troubleshooting.…

2026/10/14 3:07:32 阅读更多 →
仓颉语言 Decimal 基本属性详解:sign / scale / value / precision 实战指南

仓颉语言 Decimal 基本属性详解:sign / scale / value / precision 实战指南

文档知识库教程OpenHarmony 【免费下载链接】CangjieCorpus 本仓库为仓颉编程语言语料库,聚焦 仓颉编程语言 核心知识体系,整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源,经结构化处理与专业标注,构建为支持 R…

2026/10/14 3:07:32 阅读更多 →
Wing 云服务(cloud.Service)在模拟器中的令牌(Token)绑定与端到端测试

Wing 云服务(cloud.Service)在模拟器中的令牌(Token)绑定与端到端测试

编程语言编译器云原生语言运行时 【免费下载链接】wing A programming language for the cloud ☁️ A unified programming model, combining infrastructure and runtime code into one language ⚡ 项目地址: https://gitcode.com/gh_mirrors/wi/wing 点击查看 免…

2026/10/14 3:07:32 阅读更多 →
大模型之LangGraph多轮对话记忆

大模型之LangGraph多轮对话记忆

用 LangGraph 的 Reducer,轻松搞定多轮对话记忆 做聊天机器人最头疼的是什么?是记不住上文。今天分享一个 LangGraph 的小技巧:用 Reducer 机制优雅地管理对话历史。 核心只有一行代码: messages: Annotated[Sequence[AnyMessa…

2026/10/14 3:07:32 阅读更多 →
免费三步:老 Mac 升级最新 macOS

免费三步:老 Mac 升级最新 macOS

免费三步:老 Mac 升级最新 macOS 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 一台 2015 年的 MacBook Pro,App Store 早就不给推送…

2026/10/14 3:07:32 阅读更多 →
PySide2工具栏与状态栏实战:QToolBar和QStatusBar高效开发指南

PySide2工具栏与状态栏实战:QToolBar和QStatusBar高效开发指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 3:06:32 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →