当前位置: 首页 > news >正文

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

文章目录

  • 497. Java 反射 - 使用反射读取注解
    • 1. 为什么要关心注解?
    • 2. 获取注解的工具类:`AnnotatedElement`
    • 3. 示例:类级别注解
    • 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;}

在类上使用:

@Serialized@BeanpublicclassPerson{}

通过反射读取:

Class<?>c=Person.class;booleanisBean=c.isAnnotationPresent(Bean.class);System.out.println("isBean = "+isBean);Annotation[]annotations=c.getAnnotations();for(Annotationannotation:annotations){System.out.println("annotation = "+annotation);}

输出:

isBean=trueannotation=@org.devjava.Serialized(format=JSON)annotation=@org.devjava.Bean()

👉 注意:返回的其实是注解类的实例对象,你可以直接调用它的方法。

Serializedserialized=c.getAnnotation(Serialized.class);System.out.println("format = "+serialized.format());

输出:

format=JSON

4. 示例:重复注解 (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;}

读取注解:

方式一:通过容器注解@Validators

FieldnameField=Person.class.getDeclaredField("name");Annotation[]annotations=nameField.getAnnotations();Validatorsvalidators=(Validators)annotations[0];for(Validatorv:validators.value()){System.out.println("validator = "+v);}

输出:

validator=@org.devjava.Validator(NON_NULL)validator=@org.devjava.Validator(NON_EMPTY)

方式二:直接用getAnnotationsByType()

Validator[]validators=nameField.getAnnotationsByType(Validator.class);for(Validatorv:validators){System.out.println("annotation = "+v);}

输出:

annotation=@org.devjava.Validator(NON_NULL)annotation=@org.devjava.Validator(NON_EMPTY)

👉 第二种方式更简洁,JDK 会自动帮你展开容器注解。


5. 总结

  • 注解是框架的“说明书”,框架通过反射读取注解来决定如何运行。
  • 类、方法、字段、构造函数都可以携带注解,并通过AnnotatedElement访问。
  • isAnnotationPresent():检查是否存在。
  • getAnnotation():获取单个注解。
  • getAnnotationsByType():用于重复注解。
http://www.jsqmd.com/news/1408436/

相关文章:

  • 2026年AiPPT制作全攻略:学术汇报从3天缩到3小时
  • 2026 年当下,连江比较好的PET亚克力保护膜生产厂家综合实力解析,手机屏摔碎才懂,这层不起眼的膜居然能救上万块!-平宇新材料 - 企业推荐管【认证】
  • 构建API代理与发现系统:实现按需调用与按次付费
  • 腾达AX3000 Mesh WiFi6路由器评测:入门级Mesh如何解决家庭信号死角?
  • AI早报 2026-08-16|DeepSeek V4 Pro 转正 + Grok 4.6 同夜发布,AI Coding 价格战白热化;宇树上市成 A 股人形机器人第一股
  • 别人不要的稿子,千万别接
  • 浙江温州聚合物加固砂浆知名厂家 - 推客
  • 免费离线!SugarTrack安卓血糖日志应用,保护隐私还能便捷记录
  • 氯咪巴唑本地办事处:能上门提货的本地厂家,通常具备自营仓储与物流 - 推客
  • UML包图实战:从核心概念到架构设计的可视化指南
  • 大模型预训练新范式:从Token Zero开始的对齐方法探索
  • 同传Gino小翻译发现很多新手只会被动听音翻译,完全没有预判意识,全程被语流带着走,节奏极其被动。其实绝大多数会议发言,都有固定的逻辑框架,无非是背景阐述、现状分析、问题痛点、对策方案、未来展望这几类
  • 域名所有权验证:DNS与文件验证原理、场景与避坑指南
  • 从零构建AI可观测性:基于Python的模型监控与数据漂移检测实践
  • OpenClaw最新版本安装升级全攻略,TopClaw三分钟自动部署满血新体验
  • 智能体互联网:从单体AI到群体协作的架构演进与实践
  • 卷积(三):快速卷积 (FFT‑法) 原理与代码落地,告别时域卷积算力困境
  • 三星或 2027 年推头戴式耳机 Galaxy H1,剑指 AirPods Max 等高端市场!
  • 2026 年现阶段郯城靠谱的实体工厂短视频代运营运营中心联系方式,工厂老板花1分钱做这件事,居然比雇10个销售还管用?-抖盈科技 - 行业推荐官-2
  • 关于防爆风机本地工程商,妍熙通风给工程客户的三份交付清单模板 - 推客
  • 论文AI率太高怎么降?26届过来人分享降AIGC经验
  • Nginx三种安装方式详解:源码、包管理、Docker
  • DC调光与PWM调光原理全解析:如何选择不伤眼的屏幕?
  • 超厉害!用 Codex 自动研究,GPU Mode qr_v2 内核加速 232 倍
  • 数学建模竞赛答辩名单解析:评审机制、论文要素与备赛策略
  • Cordis:积极开发中的时空可组合性元框架,API 或无通知变更
  • SpringBoot+Vue企业人事管理系统:从架构设计到工程化部署全解析
  • 彻底解决d3dx9_35.dll丢失:DirectX运行库修复全攻略
  • Linux文件批量重命名实战技巧与工具指南
  • Voltair 招飞测工程师,构建全球首个地球观测无人机分布式网络!