Java定义注释类型

示例

注释类型用定义@interface。参数的定义类似于常规接口的方法。

@interface MyAnnotation {
    String param1();
    boolean param2();
    int[] param3();  // 数组参数 
}

默认值

@interface MyAnnotation {
    String param1() default "someValue";
    boolean param2() default true;
    int[] param3() default {};
}

元注释

元批注是可以应用于批注类型的批注。特殊的预定义元注释定义了注释类型的使用方式。

@目标

该@Target元注释限制注解可以应用到的类型。

@Target(ElementType.METHOD)
@interface MyAnnotation {
    // 此注释只能应用于方法
}

可以使用数组符号添加多个值,例如 @Target({ElementType.FIELD, ElementType.TYPE})

可用值

元素类型目标目标元素上的示例用法
ANNOTATION_TYPE注释类型
@Retention(RetentionPolicy.RUNTIME) 
@interface MyAnnotation
建设者构造函数
@MyAnnotation
public MyClass() {}
领域字段,枚举常量
@XmlAttribute
private int count;
LOCAL_VARIABLE方法内部的变量声明
for (@LoopVariable int i = 0; i < 100; i++) {
    @Unused
    String resultVariable;
}
包(中package-info.java)
@Deprecated
package very.old;
方法方法
@XmlElement
public int getCount() {...}
参数方法/构造函数参数
public Rectangle(
       @NamedArg("width") double width,
       @NamedArg("height") double height) {
    ...
}
类型类,接口,枚举
@XmlRootElement
public class Report {}
Java SE 8
元素类型目标目标元素上的示例用法
TYPE_PARAMETER类型参数声明
public <@MyAnnotation T> void f(T t) {}
TYPE_USE使用类型
Object o = "42";
String s = (@MyAnnotation String) o;

@保留

该@Retention元注释定义了在应用程序编译过程或执行注释知名度。默认情况下,注释包含在.class文件中,但在运行时不可见。为了使注释在运行时可访问,RetentionPolicy.RUNTIME必须在该注释上进行设置。

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    // 可以在运行时通过反射来访问此批注
}

可用值

保留政策影响
注释在.class文件中可用,但在运行时不可用
运行该批注在运行时可用,可以通过反射进行访问
资源注释在编译时可用,但未添加到.class文件中。注释可以例如由注释处理器使用。

@记录

该@Documented元注释是用来标记注释,其使用应通过API文档生成javadoc的一样被记录。它没有值。使用@Documented,所有使用注释的类都将在其生成的文档页面上列出它。没有@Documented,就无法查看文档中哪些类使用了注释。

@遗传

该@Inherited元注释是有关被应用于类的注释。它没有值。将注释标记为@Inherited会更改注释查询的工作方式。

  • 对于非继承的注释,查询仅检查正在检查的类。

  • 对于继承的注释,查询还将(递归)检查超类链,直到找到注释的实例。

请注意,仅查询超类:将附加到类层次结构中接口的任何注释。

@可重复

在@RepeatableJava中8.加入元注释这表明注释的多个实例可以连接到注释的目标。此元注释没有值。