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

《Java 100 天进阶之路》第26篇:Java注解(Annotation)详解

第26篇:Java注解(Annotation)详解


📌系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第25篇:Java类加载与初始化 |
➡️ 下一篇:第27篇:Java代理类详解👈待发布


一、核心知识点

  • 注解的定义:元数据,为程序元素(类、方法、字段)添加标记或配置
  • 内置注解:@Override@Deprecated@SuppressWarnings@FunctionalInterface
  • 元注解:@Target@Retention@Documented@Inherited@Repeatable
  • 自定义注解的声明与使用
  • 注解的保留策略(SOURCECLASSRUNTIME
  • 注解的解析:通过反射读取注解信息

二、通俗讲解(1分钟开心学)

1. 什么是注解?

注解是 Java 5 引入的一种特殊“标记”,可以附加在类、方法、字段等元素上,用来提供额外的元数据。它不影响程序的直接运行,但可以被编译器、工具或框架读取,用来生成代码、进行校验、配置等。

2. 常见内置注解

  • @Override:告诉编译器该方法重写了父类方法,如果父类没有该方法会编译报错。
  • @Deprecated:标记某个元素已过时,使用时会编译警告。
  • @SuppressWarnings:抑制编译器警告。
  • @FunctionalInterface:标记函数式接口(Java 8),只允许一个抽象方法。

3. 元注解——用来定义注解的注解

  • @Target:限制注解可以放在哪里(类、方法、字段等)。
  • @Retention:注解保留到什么时候(源码、字节码、运行时)。
  • @Documented:是否生成到 Javadoc 中。
  • @Inherited:子类是否继承父类的注解。
  • @Repeatable:允许同一个位置重复使用同一个注解(Java 8)。

4. 自定义注解

public@interfaceMyAnnotation{Stringvalue()default"";// 注解属性intcount()default1;}

5. 注解的解析

如果保留策略是RUNTIME,可以通过反射获取注解信息,这是 Spring、JUnit 等框架的基础。

生活类比
注解就像商品上的标签。@Override是“保修标签”,告诉检查员这是原厂零件。@Deprecated是“停产清仓”标签,提醒大家尽量别买。自定义注解就像你自己贴的“易碎品”标签,只有你(框架)能看懂并处理。

三、实操代码案例 + 场景说明

场景:自定义一个@Test注解,模拟单元测试框架,在运行时自动执行标注了@Test的方法。

importjava.lang.annotation.*;importjava.lang.reflect.Method;// 1. 自定义注解@Retention(RetentionPolicy.RUNTIME)// 保留到运行时@Target(ElementType.METHOD)// 只能用在方法上@interfaceTest{Stringdescription()default"";}// 2. 使用注解的测试类classMyTest{@Test(description="测试加法")publicvoidtestAdd(){System.out.println("执行 testAdd");}@TestpublicvoidtestSub(){System.out.println("执行 testSub");}publicvoidnormalMethod(){System.out.println("普通方法,不执行");}}// 3. 解析注解,运行测试publicclassAnnotationDemo{publicstaticvoidmain(String[]args)throwsException{MyTestobj=newMyTest();Method[]methods=obj.getClass().getDeclaredMethods();for(Methodmethod:methods){if(method.isAnnotationPresent(Test.class)){TesttestAnno=method.getAnnotation(Test.class);System.out.println("发现测试方法:"+method.getName());if(!testAnno.description().isEmpty()){System.out.println(" 描述:"+testAnno.description());}method.invoke(obj);// 执行方法}}}}

四、避坑要点

错误/误区后果正确做法
注解的@Retention设为SOURCECLASS,但运行时用反射读取读不到注解需要运行时读取必须设为RUNTIME
@Target不限制,注解用在不合适的位置语义混乱明确指定@Target
注解属性名为value时,使用时可以省略属性名,但容易忘记代码可读性下降属性名清晰时不要都叫value
重复注解未配置@Repeatable和容器注解编译错误按规范定义

五、面试高频考点

Q1:@Override注解的作用是什么?

标记该方法重写父类方法,编译器会检查父类是否有该方法,如果没有则报错,避免写错方法名或参数。

Q2:@Retention的三种策略有什么区别?

SOURCE:只在源码中保留,编译后丢弃(如@Override)。CLASS:保留在字节码中,但运行时不可见(默认)。RUNTIME:保留到运行时,可通过反射读取(如 Spring 注解)。

Q3:如何获取一个方法上的注解值?

通过反射:Method method = ...; MyAnnotation anno = method.getAnnotation(MyAnnotation.class); String value = anno.value();

六、练习题

  1. 设计:自定义一个@NotNull注解,用于标记方法的参数不能为 null,然后写一个处理器在运行时检查。
  2. 代码分析:下面注解能否正常工作?为什么?
    @Retention(RetentionPolicy.CLASS)@interfaceMyAnno{}
  3. 动手:实现一个简单的“权限注解”,在方法上标注@RequireRole("admin"),然后在调用时检查当前用户角色。

📊 你的学习进度

  • 当前:第26篇 / 共44篇 ·第四阶段:注解、反射、代理、日期(第26~31篇)
  • ✅ 已完成:第1~25篇
  • 📖 正在学:第26篇
  • ⏳ 待学习:第27~44篇

👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇

💡 本专栏每篇都包含:避坑表 + 面试高频考点 + 练习题。每天30分钟,100天拿offer!


下一篇文章预告

《Java代理类详解》

内容简介:静态代理、JDK动态代理(基于接口)、CGLIB动态代理(基于继承),AOP原理入门。

💡 学完这篇,你将掌握代理模式,理解Spring AOP的底层实现。

📌《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!


http://www.jsqmd.com/news/842495/

相关文章:

  • 从‘密码长度’到‘任意代码执行’:手把手复现攻防世界int_overflow靶场(附Python3 EXP)
  • TVA智能体范式的工业视觉革命(7)
  • 从游戏显卡到专业GIS:如何为你的SuperMap三维场景挑选并调校一张合适的显卡
  • TVA智能体范式的工业视觉革命(8)
  • 深入QGIS矢量数据底层:手写WKT字符串添加几何图形,一次搞懂空间数据存储原理
  • 卡梅德生物技术快报|单 B 细胞抗体制备:流程优化、表达系统适配与性能数据
  • ARM Thumb指令集立即数编码与寄存器操作详解
  • SpringBoot项目实战:5分钟搞定OneNET物联网平台设备数据查询与指令下发
  • 2026年10款国内外主流降AI率工具大盘点(含最新免费可用版) - 降AI实验室
  • 5分钟搞定Android Studio中文界面:免费汉化插件完整指南
  • 企业无线网络进阶:FreeRadius服务器配置与TLS证书实战
  • 猫抓扩展三大核心功能深度解析:从零基础到高效视频下载
  • 【2026最新附图文】JDK25 下载、配置、卸载 保姆级教学(全程附实操步骤图)
  • 低纹波LED驱动电源数字控制策略【附代码】
  • BGP选路实战:华为与思科设备在MED、Local_Pref属性上的配置差异与避坑指南
  • 为开发者工具注入情感分析能力:开源库ai-devtools-sentiment实战指南
  • 为什么你的NotebookLM要点召回率低于61.8%?——基于172份真实用户数据集的BERT-Chunk对齐缺陷报告
  • 通过curl命令快速测试Taotoken的ChatGPT接口是否通畅
  • TVA智能体范式的工业视觉革命(9)
  • 避开STC89C52RC定时器2的那些‘坑’:从模式选择到波特率计算的全流程避坑指南
  • 本地AI助手框架搭建:基于模块化架构与RAG技术的实践指南
  • 大豆施肥管理分区实时划分及变量喷施液态肥控制方法【附代码】
  • KMS_VL_ALL_AIO终极指南:5分钟免费激活Windows和Office的完整方案
  • Uniapp中处理加密PDF流:从字节数组到本地渲染的完整实践
  • 什么是逻辑回归,它与线性回归有什么关系?
  • CAXA 等距线(偏移)
  • SAP Smartforms避坑指南:从‘没有输出请求打开’到字体设置,手把手解决5个高频问题
  • 避坑指南:Tina Linux下MIPI DSI与LVDS屏调试的那些‘坑’(以V853/D1s为例)
  • 2026年05月探秘成都,新生儿照安心门店大揭秘,生日照/儿童摄影/儿童照/百天上门照/全家福,新生儿照品牌有哪些 - 品牌推荐师
  • 2026年评价高的耐晒户外环保不干胶/彩色印刷环保不干胶精选推荐公司 - 行业平台推荐