注解(Annotation)概述
1. 注解的定义与作用
- 定义:
注解是Java提供的一种元数据机制,用于为代码添加标记信息。它们本身不影响程序逻辑,但可以被编译器、开发工具或运行时框架读取并处理。 - 核心作用:
- 代码标记:标识代码特性(如
@Override
标记方法重写)。 - 配置简化:替代XML配置(如Spring的
@Autowired
)。 - 编译检查:提示编译器进行额外验证(如
@Deprecated
警告过时方法)。 - 运行时处理:通过反射动态读取注解信息(如JUnit的
@Test
)。
2. Java内置常用注解
注解 | 作用 |
---|
@Override | 标记方法重写父类或接口方法,编译器检查方法签名是否正确。 |
@Deprecated | 标记类、方法或字段已过时,编译器生成警告。 |
@SuppressWarnings | 抑制编译器警告(如@SuppressWarnings("unchecked") )。 |
@FunctionalInterface | 标记接口为函数式接口,确保只有一个抽象方法。默认方法和静态方法可以有多个。这个只能管抽象方法的个数。 |
3. 元注解(Meta-Annotations)
元注解用于定义其他注解的行为,Java提供以下核心元注解:
元注解 | 作用 |
---|
@Target | 指定注解可应用的目标(如类、方法、字段等),值为ElementType 枚举。 |
@Retention | 定义注解的生命周期(源码级、类文件级、运行时级),值为RetentionPolicy 。 |
@Documented | 标记注解应被包含在Javadoc中。 |
@Inherited | 允许子类继承父类的注解(默认不继承)。 |
@Repeatable | (Java 8+)允许同一位置重复使用同一注解。 |
4. 自定义注解
(1) 定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {String value() default "default"; int priority() default 1;
}
(2) 使用注解
public class Demo {@MyAnnotation(value = "test", priority = 2)public void myMethod() {}
}
(3) 注解属性规则
- 属性类型:仅支持基本类型、
String
、Class
、枚举、注解及这些类型的数组。 - 默认值:通过
default
关键字指定。 - 单值注解:若属性名为
value
,使用时可直接赋值(如@MyAnnotation("test")
)。
5. 注解的处理方式
(1) 编译时处理
- APT(Annotation Processing Tool):在编译期生成代码(如Lombok的
@Data
生成Getter/Setter)。 - 示例框架:Lombok、Dagger。
(2) 运行时处理
6. 注解的应用场景
场景 | 示例 |
---|
框架配置 | Spring的@Autowired 、@Service 。 |
单元测试 | JUnit的@Test 、@BeforeEach 。 |
持久化映射 | Hibernate的@Entity 、@Table 。 |
Web服务 | JAX-RS的@Path 、@GET 。 |
代码生成 | Lombok的@Getter 、@Setter 。 |
7. 注解 vs XML配置
对比项 | 注解 | XML配置 |
---|
可读性 | 配置与代码在一起,直观。 | 配置分散在外部文件,需跨文件查看。 |
维护性 | 修改代码时需同步修改注解。 | 集中管理,修改无需改动代码。 |
灵活性 | 强耦合于代码,适合简单配置。 | 解耦,适合复杂或频繁变化的配置。 |
编译时检查 | 支持编译器检查(如类型安全)。 | 无编译时检查,错误可能在运行时发现。 |
8. Java 8+增强
记忆方法
- 口诀:
注解如同小标签,元数据里藏信息;元注解定其行为,编译运行皆可读。
- 比喻:
- 注解像便利贴,贴在代码上传递额外说明。
- 元注解像便利贴的属性(如贴在哪里、保留多久)。
- 场景联想:
想象注解是产品标签:@Fragile
表示易碎品,@ExpiryDate
标记保质期,物流系统(框架)根据标签自动处理货物(代码)。
最佳实践
- 合理选择生命周期:
SOURCE
:仅需编译时处理(如Lombok)。RUNTIME
:需运行时反射读取(如Spring)。
- 避免过度使用:注解过多会降低代码可读性。
- 结合工具链:利用APT或反射框架简化开发。
掌握注解机制,可以显著提升代码简洁性和框架集成能力!