Skip to content

注解基础

注解(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 是最常用的内置注解

基于 VitePress 构建