Java 注解

定义

注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

使用注解

@注解名称

作用分类

  • 编写文档:通过代码里标识的注解生成文档【生成文档doc文档】

  • 代码分析:通过代码里标识的注解对代码进行分析【使用反射】

  • 编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】

元注解

用于描述注解的注解

  • @Target:描述注解能够作用的位置

    • ElementType.TYPE:可以应用于类、接口(包括注解类型)或枚举声明。
    • ElementType.METHOD:可以应用于方法级注解。
    • ElementType.FIELD:可以应用于成员变量上。
    • ElementType.PARAMETER:可以应用于方法的参数。
    • ElementType.CONSTRUCTOR:可以应用于构造函数。
    • ElementType.LOCAL_VARIABLE:可以应用于局部变量。
    • ElementType.ANNOTATION_TYPE:可以应用于注解类型。
    • ElementType.PACKAGE:可以应用于包声明。
    • ElementType.TYPE_PARAMETER(Java 8新增):可以应用于类型参数。
    • ElementType.TYPE_USE(Java 8新增):可以应用于任何使用类型的地方。
  • @Retention:描述注解被保留的阶段

    • RetentionPolicy.SOURCE:表示注解信息只在源代码级别保留,编译器使用它然后丢弃,它不会被包含在编译后的.class文件中。这通常用于标记性注解,比如覆盖检查,在编译时进行检查,之后不再需要。如果@Override注解里的@Retention(RetentionPolicy.SOURCE)就不会编译到class文件中。
    • RetentionPolicy.CLASS:注解在编译时被保留,在类文件中存在,但JVM在运行时不保留。这是默认行为。
    • RetentionPolicy.RUNTIME:注解在运行时被保留,可以通过反射机制读取注解的信息。
  • @Documented:指示将此注解包含在Javadoc中,没有特定的取值。

  • @Inherited:指示子类可以继承父类中的注解,没有特定的取值。

  • @Repeatable:(Java 8新增)允许在单一元素上多次使用相同的注解,没有特定的取值。

JDK中预定义的一些注解

@Override

重写超类型中的方法声明

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

指示方法声明旨在重写超类型中的方法声明。如果方法具有此批注类型,则编译器需要生成错误消息,除非至少满足以下条件之一:

  • 该方法重写或实现在超类型中声明的方法。
  • 该方法具有一个签名,该签名等效于 Object 中声明的任何公共方法的签名。

@Deprecated:该注解标注的内容,表示已过时

该注解标注的内容,表示已过时

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public @interface Deprecated {

    /**
     * 返回已弃用批注元素的版本。版本字符串的格式和命名空间与 javadoc 标记的值 @since 相同。默认值为空字符串。
     *
     * @return 版本字符串
     * @since 9
     */
    String since() default "";

    /**
     * 指示在将来的版本中是否要删除带批注的元素。缺省值为 false。
     *
     * @return 元素是否需要删除
     * @since 9
     */
    boolean forRemoval() default false;
}

带 @Deprecated 注释的程序元素是程序员不鼓励使用的元素。一个元素可能由于以下几个原因而被弃用,例如,它的使用可能会导致错误;它可能会在不兼容的情况下更改或在将来的版本中删除;它已被一种更新的、通常更可取的替代方案所取代;或者它已经过时了。

当在未弃用的代码中使用或重写已弃用的程序元素时,编译器会发出警告。 @Deprecated 在局部变量声明、参数声明或包声明上使用批注对编译器发出的警告没有影响。

当某个模块被弃用时,在 中使用该模块 requires而不是 in exports 或 opens 子句会导致发出警告。不推荐使用的模块不会导致对模块内类型的使用发出警告。

此注释类型具有字符串值元素 since。此元素的值指示首次弃用带批注的程序元素的版本。

此注释类型具有布尔值元素 forRemoval。值 true 表示在将来的版本中删除带批注的程序元素的意图。值 false 表示不鼓励使用带批注的程序元素,但在批注程序元素时,没有删除它的特定意图。

@SuppressWarnings

压制警告

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

一般传递参数all @SuppressWarnings("all")

自定义注解

格式

元注解
public @interface 注解名称{
      属性列表;
}

本质注解本质上就是一个接口,该接口默认继承Annotation接口

public interface MyAnno extends java.lang.annotation.Annotation {
}

属性:接口中的抽象方法

要求:

  1. 属性的返回值类型有下列取值

    • 基本数据类型(四类八种)
    • String
    • 枚举
    • 注解
    • 以上类型的数组
  2. 定义了属性,在使用时需要给属性赋值

    • 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
    • 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
    • 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略
posted @ 2021-02-04 11:05  雨中遐想  阅读(68)  评论(0编辑  收藏  举报