JAVA重点基础、进阶知识及易错点总结(34)注解基础(Annotation)
Java 巩固进阶 · 第 34 天主题注解基础Annotation—— 代码的元数据标签 进度概览继设计模式之后今天学习Java 注解体系。注解是代码的标签是 Spring、MyBatis、JUnit 等框架的核心基础理解注解是阅读框架源码的必备技能。 核心价值框架基石理解 SpringAutowired、MyBatisSelect、JUnitTest的底层原理。代码简化用注解替代 XML 配置减少样板代码提升开发效率。元编程能力结合反射读取注解信息实现动态逻辑如 AOP、依赖注入。面试高频元注解含义、自定义注解实现、注解生命周期是常考题。一、注解本质给代码添加元数据 ️1. 什么是注解┌─────────────────────────────────────┐ │ 注解的本质 │ │ 是一种特殊的接口用于给代码打标签 │ │ │ │ • 不影响程序逻辑编译后仍存在 │ │ • 可被编译器或运行时读取 │ │ • 替代 XML 配置简化开发 │ └─────────────────────────────────────┘2. 注解 vs 注释特性注释Comment注解Annotation语法//或/* */Annotation作用给人看说明代码给编译器/框架看携带元数据运行时编译后消失可保留到运行时取决于 Retention可读取❌ 无法通过代码读取✅ 可通过反射读取一句话理解“注释是给人看的说明注解是给机器看的标签”二、内置注解JDK 自带的三大注解 1. 常用内置注解// ✅ Override检查方法是否重写父类/接口方法OverridepublicStringtoString(){returnUser{};}// ⚠️ 如果拼写错误如 Overide编译会报错// ✅ Deprecated标记方法/类已过时DeprecatedpublicvoidoldMethod(){// 调用时会显示删除线警告}// ✅ SuppressWarnings抑制编译器警告SuppressWarnings(unchecked)publicvoidmethod(){// 泛型 unchecked 警告被抑制}2. 元注解定义注解的注解⭐ 必背// Target指定注解可以作用的位置Target(ElementType.METHOD)// 只能用在方法上Target(ElementType.FIELD)// 只能用在字段上Target({ElementType.TYPE,ElementType.METHOD})// 可用在类和方法上// Retention指定注解保留到什么时候Retention(RetentionPolicy.SOURCE)// 仅源码保留编译后丢弃如 OverrideRetention(RetentionPolicy.CLASS)// 编译到 class 文件运行时丢弃Retention(RetentionPolicy.RUNTIME)// ✅ 运行时保留反射可读取框架常用// Documented是否包含在 Javadoc 中Documented// 生成 API 文档时显示此注解// Inherited子类是否继承父类的注解Inherited// 父类有注解子类自动继承仅对类注解有效3. Retention 三阶段对比源码 (.java) → 编译 → 字节码 (.class) → 加载 → 运行时 (JVM) SOURCE: [████] (编译后消失如 Override) CLASS: [████████] (运行时消失如 Nullable) RUNTIME: [████████████] (全程保留如 Autowired)框架选型自定义注解如果要被 Spring/反射读取必须用Retention(RUNTIME)三、自定义注解实战定义 Log 注解 1. 定义注解// ✅ 标准注解定义模板Target(ElementType.METHOD)// 作用在方法上Retention(RetentionPolicy.RUNTIME)// 运行时保留反射可读取Documented// 包含在 Javadoc 中publicinterfaceLog{// 注解属性类似接口方法Stringvalue()default;// 默认值Stringlevel()defaultINFO;// 日志级别booleanenabled()defaulttrue;// 是否启用}2. 使用注解publicclassUserService{// ✅ 使用自定义注解Log(value创建用户,levelINFO)publicvoidcreateUser(Stringname){System.out.println(创建用户name);}// ✅ 使用默认值Log(删除用户)publicvoiddeleteUser(Longid){System.out.println(删除用户id);}// ❌ 无注解不会被日志拦截器处理publicvoidupdateUser(Longid){System.out.println(更新用户id);}}3. 注解属性规则publicinterfaceMyAnnotation{// ✅ 合法属性类型intvalue();// 基本类型Stringname();// StringClass?clazz();// ClassLogLevellevel();// 枚举String[]tags();// 数组OtherAnnotationother();// 其他注解// ✅ 必须有默认值除非使用时指定Stringdesc()default;// ❌ 非法不能有方法体、不能是泛型// void method() {} // 错误// T T getValue(); // 错误}⚠️特殊规则如果注解只有一个value属性使用时可省略属性名Log(创建用户)// 等价于 Log(value 创建用户)四、 今日实战任务注解定义与使用任务 1定义 Log 日志注解/** * 要求 * 1. 创建 Log 注解包含属性value操作描述、level日志级别 * 2. 设置 Target 为 METHODRetention 为 RUNTIME * 3. 为 level 设置默认值 INFO * * 提示 * 枚举类型定义enum LogLevel { INFO, WARN, ERROR } */任务 2在 Service 类上使用注解/** * 业务场景用户管理服务 * * 要求 * 1. 创建 UserService 类 * 2. 在 createUser、deleteUser、updateUser 方法上添加 Log 注解 * 3. 每个方法描述不同的操作内容 * 4. 测试类调用这些方法观察是否正常执行 * * 挑战 * - 尝试不写 value 属性只用默认值 * - 观察 IDEA 是否显示注解信息 */任务 3探索 JDK 内置注解/** * 要求 * 1. 创建一个类故意错误使用 Override如拼写错误的方法名 * 2. 观察编译器报错信息 * 3. 用 Deprecated 标记一个方法在另一处调用它 * 4. 观察 IDEA 的删除线警告 * * 思考 * - Override 是如何在编译期检查的 * - Deprecated 警告可以被抑制吗 */任务 4定义复杂注解/** * 要求 * 1. 定义 ApiEndpoint 注解包含属性 * - pathString接口路径 * - methodStringHTTP 方法GET/POST * - authboolean是否需要认证 * 2. 在 Controller 类的方法上使用此注解 * 3. 尝试使用数组属性String[] roles() * * 提示 * 这模拟了 Spring MVC 的 RequestMapping 注解 */ 第 34 天 · 核心总结极简背诵版内置注解Override// 检查重写Deprecated// 标记过时SuppressWarnings// 抑制警告四大元注解Target// 作用位置METHOD/FIELD/TYPE...Retention// 保留策略SOURCE/CLASS/RUNTIME⭐Documented// 是否包含在 JavadocInherited// 子类是否继承自定义注解模板Target(ElementType.METHOD)Retention(RetentionPolicy.RUNTIME)// 框架注解必须 RUNTIMEpublicinterfaceMyAnnotation{Stringvalue()default;}注解属性规则只能是基本类型、String、Class、枚举、注解、数组必须提供默认值或使用时指定单属性名为 value 时可省略属性名明天预告注解与反射结合—— 让注解活起来通过反射获取注解信息getAnnotation注解的实际应用参数校验、日志记录实战扫描 Log 注解自动打印日志原理Spring AOP 注解驱动的底层实现准备好了吗明天我们让注解从标签变成可执行的逻辑 ✨
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2487082.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!