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

文章目录

  • 前言
  • 注解
  • 使用场景
  • 常用注释
    • [1. @Override](#1. @Override)
    • [2. @Deprecated](#2. @Deprecated)
    • [3. @SuppressWarnings](#3. @SuppressWarnings)
  • 自定义注解与元注解
      • [1. 定义自定义注解](#1. 定义自定义注解)
      • [2. 使用自定义注解](#2. 使用自定义注解)
      • [3. 处理自定义注解](#3. 处理自定义注解)
      • [4. 常见元注解](#4. 常见元注解)
      • 总结

前言

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


注解

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

注解可以在类编译、运行时进行加载,体现不同的功能。

使用场景

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

常用注释

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

1. @Override

  • 用途:标识一个方法是重写父类中的方法。

  • 作用:编译器会检查方法是否正确重写了超类的方法。如果方法名、参数类型或数量不匹配,编译器会报错,帮助开发者避免错误。

  • 示例

    java 复制代码
    class Parent {
        void display() {
            System.out.println("Parent");
        }
    }
    
    class Child extends Parent {
        @Override
        void display() {
            System.out.println("Child");
        }
    }

2. @Deprecated

  • 用途:标记某个方法、类或字段不再推荐使用,可能在将来的版本中删除。

  • 作用:编译器会发出警告,提示开发者该元素已过时,建议使用替代方案。

  • 示例

    java 复制代码
    class OldClass {
        @Deprecated
        void oldMethod() {
            System.out.println("This method is deprecated");
        }
    }

3. @SuppressWarnings

  • 用途:用于抑制特定的编译器警告。

  • 作用:可以指定需要抑制的警告类型,例如"unchecked"或"deprecation",使得代码更清晰且不受不必要的警告影响。

  • 示例

    java 复制代码
    class SuppressWarningsExample {
        @SuppressWarnings("unchecked")
        void exampleMethod() {
            List list = new ArrayList(); // 无检查警告
            list.add("String");
        }
    }

自定义注解与元注解

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

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

1. 定义自定义注解

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

示例:
java 复制代码
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. 使用自定义注解

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

java 复制代码
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引入):用于任何类型的使用位置,例如作为类型的使用。
    • 示例

      java 复制代码
      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:注解在运行时可用,可以通过反射读取。
    • 示例

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

    • 示例

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

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

    • 示例

      java 复制代码
      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.");
              }
          }
      }

总结

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


相关推荐
开朗觉觉3 分钟前
RabbitMQ高可用&&延迟消息&&惰性队列
java·rabbitmq·java-rabbitmq
zmd-zk4 分钟前
flink学习(3)——方法的使用—对流的处理(map,flatMap,filter)
java·大数据·开发语言·学习·flink·tensorflow
昵称20217 分钟前
flink1.16+连接Elasticsearch7官方例子报错解决方案
java·flink·es7
Dreams°12316 分钟前
【大数据测试Flume:从 0-1详细教程】
大数据·python·单元测试·自动化·flume
爱编程的小生19 分钟前
Easyexcel(6-单元格合并)
java·excel
小白不太白95028 分钟前
设计模式之 迭代器模式
java·设计模式·迭代器模式
闲人一枚(学习中)30 分钟前
设计模式-创建型-单例模式
java·单例模式·设计模式
Coderfuu43 分钟前
Java技术复习提升 10异常
java·开发语言
愿天垂怜1 小时前
【C++】C++11引入的新特性(1)
java·c语言·数据结构·c++·算法·rust·哈希算法
CoderJia程序员甲1 小时前
重学SpringBoot3-Spring Retry实践
java·spring boot·spring·retry·重试机制