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

在Java里注解是如何生效的_Java注解处理原理说明

星辰同学_1874

星辰同学_1874

发布时间:2026-01-30 11:59:02

|

439人浏览过

|

来源于php中文网

原创

Java注解本身不执行逻辑,其“生效”依赖@Retention策略及配套处理机制:SOURCE级由编译器检查,CLASS级供字节码工具织入,RUNTIME级通过反射读取;Spring等框架需扫描与代理等显式支撑。

在java里注解是如何生效的_java注解处理原理说明

注解本身不执行任何逻辑

Java 注解(@interface)只是元数据标记,编译后默认不产生任何运行时行为。比如 @Override、@Deprecated 这类内置注解,靠的是 JVM 或编译器硬编码识别;而自定义注解如 @Log、@Route,必须配合额外机制才能“生效”。

关键判断点:如果你写了注解但没看到效果,大概率是漏掉了处理环节——不是注解写错了,而是没人读它。

三种主要生效路径:编译期、运行时、APT

注解的“生效”取决于它的 @Retention 策略和配套处理方式:

  • 源码级(RetentionPolicy.SOURCE):仅保留在 .java 文件中,如 @Override,由 javac 在编译时检查,编译完就丢弃
  • 类文件级(RetentionPolicy.CLASS):写入 .class 但不加载进 JVM,某些字节码工具(如 AspectJ、Byte Buddy)可在类加载前织入逻辑
  • 运行时(RetentionPolicy.RUNTIME):通过 Class.getDeclaredAnnotations() 或 Method.getAnnotation() 反射读取,Spring 的 @Autowired 就走这条路

注意:RetentionPolicy.CLASS 注解无法用反射获取,强行调用 getAnnotation() 返回 null,这是常见误判点。

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

Umbrel Proxy Manager
Umbrel Proxy Manager

高效管理与交互 Umbrel 代理服务,支持 Docker 容器。自动发现运行服务,将内部 Docker IP 映射为可访问的外部地址。

下载

Spring 中的注解为何“自动生效”

Spring 并不是魔法,它的注解(如 @Service、@Transactional)依赖两层支撑:

  • 组件扫描:配置了 @ComponentScan 后,Spring 在启动时用 ClassPathBeanDefinitionScanner 扫描 classpath,通过反射检查类是否含 @Component 等注解,匹配后注册为 Bean
  • AOP 代理:@Transactional 这类行为型注解,实际由 TransactionInterceptor 拦截方法调用,该拦截器绑定在代理对象上——没有启用 @EnableAspectJAutoProxy 或对应配置,注解就只是个标记

换句话说:Spring 容器本身不“解析”注解,它只是按约定读取、按规则触发。你手动 new 一个加了 @Service 的类,@PostConstruct 不会执行,@Value 也不会注入。

手写注解处理器的关键陷阱

如果想自己实现类似功能,别直接从反射开始——先确认三件事:

  • 注解的 @Target 是否覆盖你的目标元素(比如对字段用了只允许方法的注解,反射根本拿不到)
  • 运行时注解必须确保类已被加载且未被类加载器跳过(如模块系统下 requires 缺失会导致 ClassNotFoundException)
  • 反射读取性能敏感:频繁调用 getDeclaredAnnotations() 会触发多次类加载和解析,生产环境建议缓存结果,或改用 ASM/Byte Buddy 在类加载阶段处理

最常被忽略的一点:注解属性值如果是数组或嵌套注解,默认不能为 null,未显式赋值时取默认值(如 String[] value() default {}),空数组 ≠ null,判空逻辑写错就会漏处理。

热门AI工具

更多
豆包大模型

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

DeepSeek

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

WorkBuddy

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

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Laper
Laper Hot

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

相关专题

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

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

2811

2025.08.06

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

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

497

2026.01.26

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7019

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

4316

2024.01.03

python中class的含义
python中class的含义

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

306

2025.12.06

go中interface用法
go中interface用法

本专题整合了go语言中int相关内容,阅读专题下面的文章了解更多详细内容。

4210

2025.09.10

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

0

2026.11.03

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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