讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java里注解是如何参与程序运行的_Java注解处理原理解析

陌晨吖_4876

陌晨吖_4876

发布时间:2026-02-07 14:14:02

|

346人浏览过

|

来源于php中文网

原创

Java注解本身是元数据,不参与运行;编译期通过@Retention(SOURCE)和AnnotationProcessor处理AST生成代码,运行期通过@Retention(RUNTIME)配合反射读取,但需注意生命周期、类加载器及语义约定。

在java里注解是如何参与程序运行的_java注解处理原理解析

Java 注解本身不参与运行,它们只是元数据;真正参与运行的是你写的 AnnotationProcessor(编译期)或通过反射读取注解的代码(运行期)。

注解怎么在编译期起作用:@Retention(RetentionPolicy.SOURCE) 和 AnnotationProcessor

这类注解只保留在源码阶段,比如 @Override、@SuppressWarnings。自定义时需配合 javax.annotation.processing.AbstractProcessor 实现编译期逻辑:

  • 必须声明 @SupportedAnnotationTypes 指定处理哪些注解
  • 不能在 processor 里用反射读取被注解的类——此时字节码还没生成,只能用 Element 和 TypeMirror API 分析 AST
  • 生成新文件要用 Filer.createSourceFile(),不能直接写磁盘
  • Maven 中需用 maven-compiler-plugin 配置 annotationProcessors,否则 processor 不会被触发

注解怎么在运行期起作用:@Retention(RetentionPolicy.RUNTIME)

只有标了 @Retention(RetentionPolicy.RUNTIME) 的注解才能被反射读到。关键点在于:

  • Class.getAnnotation(Class)、Method.getAnnotation(Class) 等方法返回的是代理对象,不是原始注解实例
  • 注解接口的方法不能有参数、不能抛异常、不能有默认值以外的实现(即所有方法都必须有 default 值)
  • 反射读取性能较低,频繁调用建议缓存结果,比如 Spring 就把 @RequestMapping 解析结果存在 HandlerMapping 中
  • 注意类加载器隔离问题:如果注解类由不同 ClassLoader 加载(如 OSGi 或某些容器),isAnnotationPresent() 可能返回 false,即使源码写了

常见踩坑:为什么我的注解“没生效”?

多数失效不是注解写错了,而是生命周期或使用方式不匹配:

立即学习“Java免费学习笔记(深入)”;

  • 用了 @Retention(RetentionPolicy.CLASS) 却试图用反射读取 → 改成 RUNTIME
  • 自定义注解没加 @Target,导致 IDE 不报错但编译器忽略它(比如注在方法上却只允许类)
  • Spring 中 @Bean 方法上的 @Transactional 不生效 → 因为是同一类内调用,代理未介入,得拆到另一个 bean
  • 用 javac -processor 手动跑注解处理器时忘了加 -s 指定生成路径,导致找不到输出文件

最易被忽略的一点:注解的语义完全由使用者定义。Java 不管 @Deprecated 是否真废弃了,也不管 @Test 是否真执行了测试——这些行为全靠外部框架或工具链约定和实现。写注解容易,让别人(或自己半年后)准确理解并正确使用它,才是难点。

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2631

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

477

2026.01.26

Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

3920

2025.09.15

Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

369

2026.05.09

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3168

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4969

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3789

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

466

2026.01.19

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn