Java 注解(Annotation)本身只是“元数据”,它不会自动产生任何行为。注解的“运行原理”核心在于:编译器或运行时环境如何识别注解,并由注解处理器 / 反射机制去读取并执行相应逻辑。
下面从 编译期 → 运行期 系统说明。
注解本质是一个 继承自 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)
原理:在编译 .java → .class 时,由注解处理器处理
流程:
.java → 编译器 → 注解处理器 → 生成新代码/校验
例子:
特点:
.java 文件在 .class 文件加载前修改字节码:
工具:
例子:
Spring / JUnit 的核心原理
JVM 加载类
↓
通过反射读取注解
↓
根据注解执行逻辑
@MyAnnotation("hello")
public class Demo {}
MyAnnotation a = Demo.class.getAnnotation(MyAnnotation.class);
System.out.println(a.value());
✅ 注解只是“标记”,逻辑由框架写
以 @Autowired 为例:
@AutowiredBeanFactory 注入对象field.isAnnotationPresent(Autowired.class)
⚠️ 注解本身不“自动运行”
❌ 错误理解:
加了
@Transactional就会自动开启事务
✅ 正确理解:
Spring 在方法调用前后,读取注解并手动开启/提交事务
Java 注解只是“标签”,真正起作用的是:编译器、字节码工具或运行时的反射代码。
如果你愿意,我可以:
你想看哪一部分?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。