注解(Annotation)概述


注解(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) 注解属性规则
  • 属性类型:仅支持基本类型、StringClass、枚举、注解及这些类型的数组。
  • 默认值:通过default关键字指定。
  • 单值注解:若属性名为value,使用时可直接赋值(如@MyAnnotation("test"))。

5. 注解的处理方式
(1) 编译时处理
  • APT(Annotation Processing Tool):在编译期生成代码(如Lombok的@Data生成Getter/Setter)。
  • 示例框架:Lombok、Dagger。
(2) 运行时处理
  • 反射API:通过ClassMethod等对象的getAnnotation()方法读取注解信息。
  • 示例:Spring的@Controller、JUnit的@Test
    Method method = Demo.class.getMethod("myMethod");
    MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
    System.out.println(annotation.value()); // 输出 "test"
    

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+增强
  • 重复注解:通过@Repeatable允许同一位置多次使用同一注解。
    @Repeatable(Authorities.class)
    public @interface Authority {
        String role();
    }
    
    public @interface Authorities {
        Authority[] value();
    }
    
    @Authority(role = "admin")
    @Authority(role = "user")
    public class User {}
    
  • 类型注解:允许在类型声明处使用注解(如List<@NonNull String>)。

记忆方法

  • 口诀
    注解如同小标签,元数据里藏信息;元注解定其行为,编译运行皆可读。
  • 比喻
    • 注解像便利贴,贴在代码上传递额外说明。
    • 元注解像便利贴的属性(如贴在哪里、保留多久)。
  • 场景联想
    想象注解是产品标签:@Fragile表示易碎品,@ExpiryDate标记保质期,物流系统(框架)根据标签自动处理货物(代码)。

最佳实践

  1. 合理选择生命周期
    • SOURCE:仅需编译时处理(如Lombok)。
    • RUNTIME:需运行时反射读取(如Spring)。
  2. 避免过度使用:注解过多会降低代码可读性。
  3. 结合工具链:利用APT或反射框架简化开发。

掌握注解机制,可以显著提升代码简洁性和框架集成能力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

步行cgn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值