497. Java 反射 - 使用反射读取注解

发布时间:2026/10/5 4:28:56

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()用于重复注解。
延伸阅读

更多相关文章

2026/9/28 14:43:55

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

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

2026/10/1 7:22:06

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

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

2026/9/27 10:00:00

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

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

2026/10/5 4:27:19

律所发票批量录入实操指南:从手工逐条到Excel导入提效

1. 为什么律所发票录入这么慢,问题到底出在哪办工桌前一坐就是一下午,就为了把几十张发票一张张敲进系统。这种事在律所行政、财务和内勤岗位上太常见了。我自己也干过这事,第一次处理月度票据归档时,对着业务管理系统逐条手工录发…

2026/10/5 4:27:19

Word公式兼容终极指南:OMML、MathType与LaTeX中转实战

前几天帮同事处理一份四十多页的数学试卷,他在Word里用MathType排得规规矩矩,拷到U盘换到我电脑上,公式全部变成灰色占位框,点都点不开。我第一反应就是老问题:公式兼容。这还没完,后面他想把手写板写的解题…

2026/10/5 4:27:19

OPC DA服务器DLL封装实战:TAG结构体与COM接口集成指南

OPC DA服务器的底层封装,整个工程里最容易被低估的就是结构体定义和TAG映射这块工作。最近我带着团队重新做了一套设备采集中间件,用DLL方式把一个原来遗留的数据采集库包成OPC DA服务器组件,交付给现场的上位机系统。做完之后最大的感触是&a…

2026/10/5 4:27:19

IP地址教学:从PPT到可验证实验的闭环设计

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

2026/10/5 4:22:19

AI应用架构设计:从Demo到生产,Agent、MCP与并发治理实战

1. 从"能跑通"到"能扛住":AI应用架构设计的真实分水岭很多人第一次搭AI应用,都是从一个脚本开始的:调一次模型接口,拼一段提示词,拿到结果打印出来,收工。这个阶段跑得通,但…

2026/10/4 0:01:02

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑