注解基础
注解(Annotation)是 Java 5 引入的特性,本质是一种元数据——它为代码提供额外信息,但不直接影响代码运行。
你可以把注解理解为「贴在代码上的便签」:编译器看到它知道要检查什么,框架看到它知道要做什么处理,开发者看到它知道这段代码是干什么的。
注解的用途
代码层级 注解的作用
─────────────────────────────────
编译时检查 → @Override 让编译器检查重写是否正确
编译时生成 → Lombok @Data 生成 getter/setter
运行时处理 → Spring @Autowired 注入依赖
运行时反射 → JUnit @Test 标记测试方法按生命周期分类
| 生命周期 | 说明 | 保留策略 | 典型用途 |
|---|---|---|---|
| SOURCE | 只在源码中存在 | 编译后丢弃 | @Override、@SuppressWarnings |
| CLASS | 存在于 .class 文件 | JVM 加载时不保留 | Lombok(JDK 6+ 注解处理器) |
| RUNTIME | 存在于运行时 | 反射可获取 | Spring @Service、JUnit @Test |
JDK 内置注解
@Override
告诉编译器这个方法是重写的,用于编译时检查:
java
public class Parent {
public void display() {
System.out.println("Parent");
}
}
public class Child extends Parent {
@Override // 如果签名写错,编译会报错
public void display() {
System.out.println("Child");
}
// ❌ 编译错误:方法签名不匹配
// @Override
// public void show() { }
}@Deprecated
标记已废弃的代码,使用时编译器会警告:
java
public class OldClass {
@Deprecated
public void oldMethod() {
System.out.println("旧方法");
}
}
// 使用时收到警告
OldClass obj = new OldClass();
obj.oldMethod(); // 编译器警告:使用了已废弃的方法@SuppressWarnings
压制编译器警告,谨慎使用:
java
// 压制所有警告
@SuppressWarnings("all")
public void method1() {
// ...
}
// 压制特定警告
@SuppressWarnings({"unchecked", "deprecation"})
public void method2() {
// ...
}
// 常用警告类型:
// - unchecked: 未检查的类型转换
// - deprecation: 使用了废弃的 API
// - rawtypes: 使用原始类型
// - unused: 未使用的变量@FunctionalInterface
JDK 8 引入,标记函数式接口,编译器检查是否只有一个抽象方法:
java
@FunctionalInterface
public interface Converter<F, T> {
T convert(F from);
// ❌ 编译错误:只能有一个抽象方法
// T convertBack(T to);
}注解与注释的区别
| 对比 | 注解 | 注释 |
|---|---|---|
| 本质 | 元数据,可被处理 | 说明文字,被编译器忽略 |
| 处理方式 | 编译器、框架、工具可读取 | 仅供人类阅读 |
| 运行时 | 可以保留到运行期 | 编译后消失 |
| 示例 | @Override | // 这段代码做什么 |
快速导航
| 主题 | 内容 |
|---|---|
| 元注解 | @Retention、@Target 等控制注解行为 |
| 自定义注解 | 创建自己的注解 |
| 注解解析 | 通过反射读取注解 |
| 注解应用场景 | 实战中的典型用法 |
要点回顾
- 注解是元数据,不直接影响代码运行,但可以被工具处理
@Retention决定注解保留到哪个阶段@Target决定注解可以用在哪些代码元素上@Override、@Deprecated、@SuppressWarnings是最常用的内置注解
