当前位置: 首页 > news >正文

注解(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或反射框架简化开发。

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

http://www.xdnf.cn/news/539713.html

相关文章:

  • web应用技术第5次课-springboot入门
  • 中科固源Wisdom平台发现NASA核心飞行控制系统(cFS)通信协议健壮性缺陷!
  • 九、异形窗口
  • 有关Groutine无限创建的分析
  • YOLO模型使用jupyterlab的方式进行预测/推理(示例)
  • Linux配置SSH密钥认证
  • 程序化 SEO 全攻略:如何高效提升网站排名?
  • 【python】返回所有匹配项的第一个元素、第二个元素。。。
  • 龙芯中科2024年度业绩说明会:企稳向好,布局未来!
  • 贵州某建筑物挡墙自动化监测
  • Dolphinscheduler执行工作流失败,后台报duplicate key错误
  • 如何通过生成式人工智能认证(GAI认证)提升自己的技能水平?
  • C++经典库介绍
  • PH热榜 | 2025-05-18
  • 微服务项目->在线oj系统(Java版 - 5)
  • 《Building effective agents》学习总结
  • C++中聚合类(Aggregate Class)知识详解和注意事项
  • 深入理解动态规划:从斐波那契数列到最优子结构
  • YoloV9改进策略:卷积篇|风车卷积|即插即用
  • 【Python-Day 15】深入探索 Python 字典 (下):常用方法、遍历、推导式与嵌套实战
  • C++容器适配器
  • DAPO:用于指令微调的直接偏好优化解读
  • 【idea 报错:java: 非法字符: ‘\ufeff‘】
  • 第二十一次博客打卡
  • 【C语言内存函数】--memcpy和memmove的使用和模拟实现,memset函数的使用,memcmp函数的使用
  • 1 asyncio模块
  • Ubuntu——配置静态IP
  • 基于Transformers与深度学习的微博评论情感分析及AI自动回复系统
  • 【C++】模版(1)
  • 基于不完美维修的定期检测与备件策略联合优化算法matlab仿真