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

【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 {
        @Override
        void display() {
            System.out.println("Child");
        }
    }
    

2. @Deprecated

  • 用途:标记某个方法、类或字段不再推荐使用,可能在将来的版本中删除。
  • 作用:编译器会发出警告,提示开发者该元素已过时,建议使用替代方案。
  • 示例
    class OldClass {
        @Deprecated
        void 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.");
              }
          }
      }
      

总结

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



http://www.kler.cn/news/319874.html

相关文章:

  • JS手写Promise以及promise.all方法
  • QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第七期]
  • Go Mail设置指南:如何提升发送邮件效率?
  • 【Linux 从基础到进阶】Hadoop 大数据平台搭建与优化
  • ARM/Linux嵌入式面经(三九):中科驭数
  • 解决多尺度网络中上采样尺寸不一致问题
  • 低代码中实现数据映射的必要性与方案
  • 18 vue3之定义自定义指令Directive
  • 10.Lab Nine —— file system-上
  • 跳跃列表(Skip List)详解
  • JS显示数字时钟的格式时间
  • Vue.js 与 Flask 或 Django 后端配合
  • ArrayList源码实现(一)
  • Scala第一天
  • Tomcat may not be running
  • Facebook个人账户被停用是什么原因?如何解决?
  • 剖析:基于 RDMA 的多机数据分发和接收场景
  • 基于Java的宠物之家小程序 宠物服务小程序【源码+调试】
  • sort 命令:文本排序
  • 计算机的错误计算(一百零四)
  • 通过两个类计算一个长方形的周长和面积
  • MySql语言操作数据库---增删改查数据库,表,数据
  • 速盾:AI能为高防cdn带来什么?
  • 828华为云征文|华为云Flexus云服务器X实例Windows系统部署一键短视频生成AI工具moneyprinter
  • 专题八_链表_算法专题详细总结
  • 一带一路区块链赛项样题解析(中)
  • C++——求3*3矩阵对角元素之和。
  • 第164天:应急响应-挖矿脚本检测指南_威胁情报_样本定性_文件清除_入口修复
  • ubuntu系统插入u盘不识别
  • 从一个Vite Vue项目开始 - 整体设计