Java注解类型

标记注解类型

标记注解类型是没有元素的注解类型,甚至没有默认值。标记注解由注解处理工具使用。

public  @interface Marker  {
}
@Marker
public class Main{

}

元注解类型

元注解类型是注解类型,用于注解其他注解类型。元注解类型是Java类库的一部分。它们在包java.lang.annotation中声明。

以下注解类型是元注解类型:

  • 目标
  • 保留
  • 继承
  • 文档记录
  • 可重复的
  • 本地

目标注释类型

目标注释类型注释注释类型以设置上下文以使用注释类型。它只有一个名为value的元素。 其值元素是java.lang.annotation.ElementType枚举类型的数组。下表列出了ElementType枚举中的所有常量。

常量名称 描述
ANNOTATION_TYPE 注释另一个注释类型声明,使注释类型为元注释。
CONSTRUCTOR 注释构造函数。
FIELD 注释字段和枚举常量。
LOCAL_VARIABLE 注释局部变量。
METHOD 注释方法。
PACKAGE 注释包声明。
PARAMETER 注释参数。
TYPE 注释类,接口(包括注释类型)或枚举声明。
TYPE_PARAMETER 在通用类,接口,方法等中注释类型参数。
TYPE_USE 注释所有类型的使用。

以下Version注释类型具有目标元注释,它指定Version注释类型可以与只有三种类型的程序元素一起使用:任何类型(类,接口,枚举和注释类型),构造函数和方法。

import java.lang.annotation.Target;
import java.lang.annotation.ElementType;

@Target({ ElementType.TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD })
public @interface Version {
  int major();

  int minor();
}

Version注释不能用于除其Target注释中指定的三种类型之外的任何程序元素。

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target({ ElementType.TYPE_USE })
@interface MyAnno {
}

@Target({ ElementType.TYPE_USE })
@interface MyAnno2 {
}

public class Main {
  public void processData() throws @MyAnno Exception {

    int roundedValue = (@MyAnno2 int) .02;

    Main t = new @MyAnno Main();
  }

}

如果不使用Target注释类型注释注释类型,则注释类型可以用作任何声明的修饰符,但类型参数声明除外。

保留(Retention)注释

保留(Retention)注释设置注释类型的保留策略。注释可以在三个级别保留 -

  • 仅源代码
  • 仅类文件,默认行为。
  • 类文件和运行时

保留(Retention)元注释类型指定Java应如何保留注释。如果注释类型具有“仅限源代码”保留策略,则在编译到类文件中时将删除其实例。如果保留策略为“仅类文件”,则其实例将保留在类文件中,但不能在运行时读取。
如果保留策略为“类文件和运行时”,则注释实例保留在类文件中,并且它们可在运行时读取。保留元注释类型声明一个名为value的元素,它是java.lang.annotation.RetentionPolicy枚举类型。

RetentionPolicy枚举有三个常量:SOURCECLASSRUNTIME,它们分别用于指定仅源,仅类和类运行时的保留策略。

以下代码在版本注释类型上使用保留元注释。它指定版本注释应该在运行时可用。

import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Target({ ElementType.TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@interface Version {
  int major();

  int minor();
}

如果不对注释类型使用保留元注释,则其保留策略仅默认为类文件。则将无法在运行时读取这些注释。在类文件中或在运行时,局部变量声明上的注释永远不可用,而不考虑注释类型的保留策略。

继承注释类型

继承注释类型是标记元注释类型。如果注释类型使用Inherited元注释注释,则其实例将由子类声明继承。
如果使用注释类型注释除类声明以外的任何元素,它没有任何效果。以下代码显示了@Inherited元注释类型的效果。

import java.lang.annotation.Inherited;

@interface Ann2 {
  int id();
}

@Inherited
@interface Ann3 {
  int id();
}

@Ann2(id = 1)
@Ann3(id = 2)
class A {
}

// Class B inherits Ann3(id=2) annotation from the class A
class B extends A {

}

文档注释

文档化注释类型是标记元注释类型。如果注释类型用Documented注解,Javadoc工具将为其所有实例生成文档。

import java.lang.annotation.Documented;

@Documented
@interface Version {
  int major();

  int minor();
}

@Version(major = 1, minor = 0)
public class Main {
}

当使用Javadoc工具为Main类生成文档时,Main类声明上的Version注释也会作为文档的一部分生成。

可重复注释

Java 8添加了可重复元注释类型。如果在一个单独的代码元素上重复使用它,注释类型声明必须用@Repeatable来注解。

Repeatable注释类型只有一个名为value的元素,其类型是另一个注释类型的类类型。

import java.lang.annotation.Repeatable;

@interface LogHistory {
  Log[] value();
}

@Repeatable(LogHistory.class)
@interface Log {
  String date();

  String comments();
}

@Log(date = "01/01/2018", comments = "B")
@Log(date = "01/21/2018", comments = "A")
public class Main {
  public static void process() {

  }
}

本地注释

本地(Native)注释类型是元注释,用于注释可以从本地代码引用的字段。它是一个标记注释。


上一篇:Java注解用法

下一篇:Java标准注解

关注微信小程序
程序员编程王-随时随地学编程

扫描二维码
程序员编程王

扫一扫关注最新编程教程