第26篇Java注解Annotation详解系列导航《Java 100 天进阶之路》完整目录 |⬅️ 上一篇第25篇Java类加载与初始化 |➡️ 下一篇第27篇Java代理类详解待发布一、核心知识点注解的定义元数据为程序元素类、方法、字段添加标记或配置内置注解Override、Deprecated、SuppressWarnings、FunctionalInterface元注解Target、Retention、Documented、Inherited、Repeatable自定义注解的声明与使用注解的保留策略SOURCE、CLASS、RUNTIME注解的解析通过反射读取注解信息二、通俗讲解1分钟开心学1. 什么是注解注解是 Java 5 引入的一种特殊“标记”可以附加在类、方法、字段等元素上用来提供额外的元数据。它不影响程序的直接运行但可以被编译器、工具或框架读取用来生成代码、进行校验、配置等。2. 常见内置注解Override告诉编译器该方法重写了父类方法如果父类没有该方法会编译报错。Deprecated标记某个元素已过时使用时会编译警告。SuppressWarnings抑制编译器警告。FunctionalInterface标记函数式接口Java 8只允许一个抽象方法。3. 元注解——用来定义注解的注解Target限制注解可以放在哪里类、方法、字段等。Retention注解保留到什么时候源码、字节码、运行时。Documented是否生成到 Javadoc 中。Inherited子类是否继承父类的注解。Repeatable允许同一个位置重复使用同一个注解Java 8。4. 自定义注解publicinterfaceMyAnnotation{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{MyTestobjnewMyTest();Method[]methodsobj.getClass().getDeclaredMethods();for(Methodmethod:methods){if(method.isAnnotationPresent(Test.class)){TesttestAnnomethod.getAnnotation(Test.class);System.out.println(发现测试方法method.getName());if(!testAnno.description().isEmpty()){System.out.println( 描述testAnno.description());}method.invoke(obj);// 执行方法}}}}四、避坑要点错误/误区后果正确做法注解的Retention设为SOURCE或CLASS但运行时用反射读取读不到注解需要运行时读取必须设为RUNTIMETarget不限制注解用在不合适的位置语义混乱明确指定Target注解属性名为value时使用时可以省略属性名但容易忘记代码可读性下降属性名清晰时不要都叫value重复注解未配置Repeatable和容器注解编译错误按规范定义五、面试高频考点Q1Override注解的作用是什么标记该方法重写父类方法编译器会检查父类是否有该方法如果没有则报错避免写错方法名或参数。Q2Retention的三种策略有什么区别SOURCE只在源码中保留编译后丢弃如Override。CLASS保留在字节码中但运行时不可见默认。RUNTIME保留到运行时可通过反射读取如 Spring 注解。Q3如何获取一个方法上的注解值通过反射Method method ...; MyAnnotation anno method.getAnnotation(MyAnnotation.class); String value anno.value();六、练习题设计自定义一个NotNull注解用于标记方法的参数不能为 null然后写一个处理器在运行时检查。代码分析下面注解能否正常工作为什么Retention(RetentionPolicy.CLASS)interfaceMyAnno{}动手实现一个简单的“权限注解”在方法上标注RequireRole(admin)然后在调用时检查当前用户角色。 你的学习进度当前第26篇 / 共44篇 ·第四阶段注解、反射、代理、日期第26~31篇✅ 已完成第1~25篇 正在学第26篇⏳ 待学习第27~44篇 完整目录 学习指南 | 订阅本专栏不错过每一篇 本专栏每篇都包含避坑表 面试高频考点 练习题。每天30分钟100天拿offer下一篇文章预告《Java代理类详解》内容简介静态代理、JDK动态代理基于接口、CGLIB动态代理基于继承AOP原理入门。 学完这篇你将掌握代理模式理解Spring AOP的底层实现。《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇建议收藏 关注一起100天拿offer 点击关注我更新后第一时间收到推送