温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java注解运行原理是什么

发布时间:2026-10-22 23:21:07 来源:亿速云 阅读:100 作者:小樊 栏目:编程语言

Java 注解(Annotation)本身只是“元数据”,它不会自动产生任何行为。注解的“运行原理”核心在于:编译器或运行时环境如何识别注解,并由注解处理器 / 反射机制去读取并执行相应逻辑。

下面从 编译期 → 运行期 系统说明。


一、注解的本质

1. 注解是什么

注解本质是一个 继承自 java.lang.annotation.Annotation 的接口

public @interface MyAnnotation {
    String value();
}

编译后等价于:

public interface MyAnnotation extends Annotation {
    String value();
}

✅ 注解本身 不包含逻辑


二、注解的生命周期(关键)

注解通过 @Retention 决定“活到哪一步”:

生命周期 说明 使用场景
SOURCE 仅源码,编译后消失 Lombok、IDE提示
CLASS 编译后存在,运行时不可见 字节码增强
RUNTIME 运行时可通过反射读取 Spring、JUnit
@Retention(RetentionPolicy.RUNTIME)

三、注解的三种处理方式

1️⃣ 编译期处理(APT)

原理:在编译 .java → .class 时,由注解处理器处理

流程:

.java → 编译器 → 注解处理器 → 生成新代码/校验

例子:

  • Lombok
  • Dagger
  • MapStruct

特点:

  • 不依赖 JVM
  • 可生成新 .java 文件
  • 性能最好

2️⃣ 字节码增强(CLASS 级别)

在 .class 文件加载前修改字节码:

工具:

  • ASM
  • Byte Buddy
  • Java Agent

例子:

  • 性能监控
  • 链路追踪

3️⃣ 运行期反射(最常见)

Spring / JUnit 的核心原理

原理流程

JVM 加载类
  ↓
通过反射读取注解
  ↓
根据注解执行逻辑

示例

@MyAnnotation("hello")
public class Demo {}

MyAnnotation a = Demo.class.getAnnotation(MyAnnotation.class);
System.out.println(a.value());

✅ 注解只是“标记”,逻辑由框架写


四、Spring 中注解是如何“生效”的?

以 @Autowired 为例:

  1. Spring 扫描类
  2. 通过反射读取字段/方法上的注解
  3. 判断是否存在 @Autowired
  4. 调用 BeanFactory 注入对象
field.isAnnotationPresent(Autowired.class)

⚠️ 注解本身不“自动运行”


五、注解 ≠ 自动执行

❌ 错误理解:

加了 @Transactional 就会自动开启事务

✅ 正确理解:

Spring 在方法调用前后,读取注解并手动开启/提交事务


六、总结一句话

Java 注解只是“标签”,真正起作用的是:编译器、字节码工具或运行时的反射代码。

如果你愿意,我可以:

  • 手写一个“迷你 Spring 注解框架”
  • 讲 Lombok / Spring / JUnit 的底层差异
  • 深入 JVM 如何存储注解

你想看哪一部分?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手