在 Java 中,注解(Annotation) 是一种元数据机制,用于为代码提供额外的信息,这些信息可以被编译器、开发工具或运行时框架读取和处理。注解本身不会直接影响代码的逻辑,但可以通过其他工具或框架来实现特定的行为。
一、注解的基本概念
- 作用:提供元数据(metadata),用于描述代码的某些特性(如版本、作者、配置等)。
- 语法:以
@符号开头,例如@Override。 - 应用场景:
- 编译检查(如
@Override) - 代码生成(如 Lombok 的
@Data) - 框架配置(如 Spring 的
@Autowired) - 单元测试(如 JUnit 的
@Test)
- 编译检查(如
二、Java 内置的常用注解
Java 提供了一些内置注解,以下是常见的几个:
-
@Override- 表示方法重写父类的方法。
- 如果方法签名不一致,编译器会报错。
@Override public String toString() { return "This is an example"; } -
@Deprecated- 标记方法、类或字段已过时,不推荐使用。
- 编译器会发出警告。
@Deprecated public void oldMethod() {} -
@SuppressWarnings- 抑制编译器警告。
@SuppressWarnings("unchecked") public void someMethod() { List list = new ArrayList(); } -
@FunctionalInterface(Java 8+)- 标记接口为函数式接口(只能有一个抽象方法)。
@FunctionalInterface public interface MyFunction { void apply(); }
三、元注解(Meta-Annotation)
元注解用于定义其他注解的行为,Java 提供了以下元注解:
-
@Target- 指定注解可以应用的位置(如类、方法、字段等)。
- 取值来自
ElementType枚举,例如:ElementType.TYPE(类/接口)ElementType.METHOD(方法)ElementType.FIELD(字段)
@Target(ElementType.METHOD) public @interface MyAnnotation {} -
@Retention- 指定注解的保留策略(生命周期)。
- 取值来自
RetentionPolicy枚举:SOURCE:仅源码保留(编译器丢弃,如@Override)。CLASS:保留到字节码(默认,但 JVM 不加载)。RUNTIME:运行时保留(可通过反射读取)。
@Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation {} -
@Documented- 标记注解是否包含在 Javadoc 中。
@Documented public @interface MyAnnotation {} -
@Inherited- 允许子类继承父类的注解。
@Inherited public @interface MyAnnotation {} -
@Repeatable(Java 8+)- 允许同一位置多次使用同一注解。
@Repeatable(MyAnnotations.class) public @interface MyAnnotation { String value(); }
四、自定义注解
通过 @interface 关键字定义注解,可以包含属性(类似方法)。
示例:定义一个带属性的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Author {
// 注解参数
String name() default "Unknown"; // 属性,可设置默认值
int year() default 2023;
}
使用自定义注解
public class MyClass {
@Author(name = "Alice", year = 2024)
public void myMethod() {}
}
五、注解的处理
注解需要通过反射或编译时处理工具(APT)来解析。
运行时处理示例
Method method = MyClass.class.getMethod("myMethod");
if (method.isAnnotationPresent(Author.class)) {
Author author = method.getAnnotation(Author.class);
System.out.println("Author: " + author.name()); // 输出 "Alice"
}
编译时处理
需要实现 AbstractProcessor 并注册到 javax.annotation.processing.Processor 文件中(常用于代码生成)。
六、常见应用场景
- 框架配置
Spring 的@Component、@Autowired。 - 数据校验
Hibernate Validator 的@NotNull、@Size。 - 测试
JUnit 的@Test、@BeforeEach。 - 代码生成
Lombok 的@Getter、@Setter。
七、总结
- 注解是 Java 的元数据机制,用于增强代码的可读性和可维护性。
- 内置注解和元注解提供了基础功能。
- 自定义注解结合反射或 APT 可实现复杂逻辑。
- 广泛应用于框架、测试和代码生成。
理解注解是掌握现代 Java 开发(如 Spring、Hibernate)的关键!
27万+

被折叠的 条评论
为什么被折叠?



