【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.");
              }
          }
      }

总结

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


相关推荐
Frostnova丶5 小时前
LeetCode 190.颠倒二进制位
java·算法·leetcode
闻哥5 小时前
Redis事务详解
java·数据库·spring boot·redis·缓存·面试
檀越剑指大厂5 小时前
【Elasticsearch系列廿】Logstash 学习
大数据·学习·elasticsearch
hrhcode5 小时前
【Netty】五.ByteBuf内存管理深度剖析
java·后端·spring·springboot·netty
道亦无名6 小时前
aiPbMgrSendAck
java·网络·数据库
发现你走远了6 小时前
Windows 下手动安装java JDK 21 并配置环境变量(详细记录)
java·开发语言·windows
心 -6 小时前
java八股文DI
java
黎雁·泠崖7 小时前
Java常用类核心详解(一):Math 类超细讲解
java·开发语言
大尚来也7 小时前
跨平台全局键盘监听实战:基于 JNativeHook 在 Java 中捕获 Linux 键盘事件
java·linux
追随者永远是胜利者7 小时前
(LeetCode-Hot100)15. 三数之和
java·算法·leetcode·职场和发展·go