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

【Java】注解与单元测试的使用【主线学习笔记】

文章目录

  • 前言
  • 注解
  • 使用场景
  • 常用注释
    • 1. @Override
    • 2. @Deprecated
    • 3. @SuppressWarnings
  • 自定义注解与元注解
      • 1. 定义自定义注解
        • 示例:
      • 2. 使用自定义注解
      • 3. 处理自定义注解
      • 4. 常见元注解
      • 总结


前言

Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和实践技巧等,分享学习心得,对自己学习过程进行整理和总结,也希望能为其他学习Java的朋友提供一些帮助和参考。


注解

在Java中,注解(Annotation)是一种特殊类型的元数据,用于提供关于程序的结构、行为或其他信息,而不直接影响程序的运行逻辑。注解可以用于类、方法、字段、参数等元素,帮助开发者在代码中嵌入额外的说明或指令。
注解可以在类编译、运行时进行加载,体现不同的功能。

使用场景

  • 生成文档相关的注解
  • 在编译时进行格式检查(JDK内置的三个基本注解)
  • 跟踪代码依赖性,实现替代配置文件功能

常用注释

在Java中,@Override@Deprecated@SuppressWarnings是三个常用的注解,各自的用途如下:

1. @Override

  • 用途:标识一个方法是重写父类中的方法。
  • 作用:编译器会检查方法是否正确重写了超类的方法。如果方法名、参数类型或数量不匹配,编译器会报错,帮助开发者避免错误。
  • 示例
    class Parent {void display() {System.out.println("Parent");}
    }class Child extends Parent {@Overridevoid display() {System.out.println("Child");}
    }
    

2. @Deprecated

  • 用途:标记某个方法、类或字段不再推荐使用,可能在将来的版本中删除。
  • 作用:编译器会发出警告,提示开发者该元素已过时,建议使用替代方案。
  • 示例
    class OldClass {@Deprecatedvoid oldMethod() {System.out.println("This method is deprecated");}
    }
    

3. @SuppressWarnings

  • 用途:用于抑制特定的编译器警告。
  • 作用:可以指定需要抑制的警告类型,例如“unchecked”或“deprecation”,使得代码更清晰且不受不必要的警告影响。
  • 示例
    class SuppressWarningsExample {@SuppressWarnings("unchecked")void exampleMethod() {List list = new ArrayList(); // 无检查警告list.add("String");}
    }
    

自定义注解与元注解

元注解就是对现有的解释进行解释说明的注解。

以下展示创建自定义注释以及元注解的使用:

1. 定义自定义注解

使用 @interface 关键字来定义注解。可以指定一些元注解(如 @Target@Retention)来控制注解的使用范围和生命周期。

示例:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;// 定义自定义注解
@Target(ElementType.METHOD) // 该注解只能用于方法
@Retention(RetentionPolicy.RUNTIME) // 在运行时可用
public @interface MyCustomAnnotation {String value() default "Default Value"; // 注解元素,具有默认值
}

2. 使用自定义注解

可以在类或方法上使用自定义注解。

public class AnnotationExample {@MyCustomAnnotation(value = "Custom Annotation Example")public void annotatedMethod() {System.out.println("This method is annotated.");}
}

3. 处理自定义注解

使用反射可以在运行时访问和处理注解(还没学,暂时按下不表)

4. 常见元注解

  1. @Target:指定注解可以应用于哪些Java元素(类、方法、字段等)。

    • 常量对象

      • TYPE:用于类、接口(包括注解类型)或枚举的声明。
      • FIELD:用于字段的声明,包括枚举常量。
      • METHOD:用于方法的声明。
      • PARAMETER:用于方法参数的声明。
      • CONSTRUCTOR:用于构造方法的声明。
      • LOCAL_VARIABLE:用于局部变量的声明。
      • ANNOTATION_TYPE:用于注解类型的声明。
      • PACKAGE:用于包的声明。
      • TYPE_PARAMETER(自Java 1.8引入):用于类型参数的声明,可以用于泛型类型。
      • TYPE_USE(自Java 1.8引入):用于任何类型的使用位置,例如作为类型的使用。
    • 示例

      import java.lang.annotation.ElementType;
      import java.lang.annotation.Target;@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) // 可以应用于类、方法和字段
      public @interface MyCustomAnnotation {String value() default "Default Value";
      }
      
  2. @Retention:指定注解的生命周期,即注解在哪个阶段可用。

    • RetentionPolicy常量

      • RetentionPolicy.SOURCE:注解仅在源代码中可用,编译时会被丢弃。
      • RetentionPolicy.CLASS:注解在编译后的字节码中可用,但运行时不可用。
      • RetentionPolicy.RUNTIME:注解在运行时可用,可以通过反射读取。
    • 示例

      import java.lang.annotation.Retention;
      import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME) // 该注解在运行时可用
      public @interface MyRuntimeAnnotation {
      }
      
  3. @Documented:指示使用该注解的元素在使用javadoc工具生成文档时应包含在内。

    • 示例

      import java.lang.annotation.Documented;@Documented
      public @interface MyDocumentedAnnotation {
      }
      
    • 使用这个注解的元素在生成的文档中会被包含。

  4. @Inherited:允许子类继承父类的注解。仅适用于类注解。

    • 示例
      import java.lang.annotation.Inherited;@Inherited
      @interface MyInheritedAnnotation {
      }@MyInheritedAnnotation
      class Parent {
      }class Child extends Parent {
      }public class Main {public static void main(String[] args) {// 检查子类是否继承了父类的注解if (Child.class.isAnnotationPresent(MyInheritedAnnotation.class)) {System.out.println("Child class inherits MyInheritedAnnotation from Parent.");}}
      }
      

总结

自定义注解提供了灵活性,可以用于各种目的,如配置、标记、文档生成等。通过结合反射,开发者可以在运行时读取并处理这些注解,从而实现更强大的功能。


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL高阶1965-丢失信息的雇员
  • Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器
  • MICS:PythonJail沙箱逃逸(持续更新中)
  • 初识C#(二)- 流程控制
  • 模拟自然的本质:与IBM量子计算研究的问答
  • Redis存储原理
  • 3、等保1.0 与 2.0 的区别
  • Mac强制停止应用
  • 数据结构总结
  • 学习记录:js算法(四十一): 基于时间的键值存储
  • Qt --- 常用控件的介绍 --- 其他控件
  • Vscode Run Code Py中文乱码问题
  • 市面第一款 C++ 版本的U盘装机软件(即将上线)
  • TCP: Textual-based Class-aware Prompt tuning for Visual-Language Model
  • 【java面经】Redis速记
  • [LeetCode] Wiggle Sort
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • angular2 简述
  • C++类的相互关联
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CentOS6 编译安装 redis-3.2.3
  • Cumulo 的 ClojureScript 模块已经成型
  •  D - 粉碎叛乱F - 其他起义
  • Golang-长连接-状态推送
  • IP路由与转发
  • Linux gpio口使用方法
  • python3 使用 asyncio 代替线程
  • redis学习笔记(三):列表、集合、有序集合
  • Spring-boot 启动时碰到的错误
  • SpringBoot 实战 (三) | 配置文件详解
  • vue2.0项目引入element-ui
  • 对超线程几个不同角度的解释
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 汉诺塔算法
  • 利用jquery编写加法运算验证码
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端知识点整理(待续)
  • 微信小程序设置上一页数据
  • 我从编程教室毕业
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​渐进式Web应用PWA的未来
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 职场生活之道:善于团结
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (16)Reactor的测试——响应式Spring的道法术器
  • (4)Elastix图像配准:3D图像
  • (4)事件处理——(7)简单事件(Simple events)
  • (AngularJS)Angular 控制器之间通信初探
  • (Qt) 默认QtWidget应用包含什么?
  • (差分)胡桃爱原石
  • (动态规划)5. 最长回文子串 java解决
  • (二)Eureka服务搭建,服务注册,服务发现
  • (十) 初识 Docker file