定义注释类型

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

@interface MyAnnotation {
    String param1();
    boolean param2();
    int[] param3();  // array parameter 
}

默认值

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

元注释

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

@目标

@Target 元注释限制了注释可以应用的类型。

@Target(ElementType.METHOD)
@interface MyAnnotation {
    // this annotation can only be applied to methods
}

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

可用值

Version => Java SE 8

@保留

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

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    // this annotation can be accessed with reflections at runtime
}

可用值

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

@Documented

@Documented 元注释用于标记注释,其用法应由 API 文档生成器(如 javadoc)记录 。它没有价值。使用 @Documented,所有使用注释的类都会在生成的文档页面上列出它。没有 @Documented,就不可能看到哪些类在文档中使用了注释。

@遗传

@Inherited 元注释与应用于类的注释相关。它没有价值。将注释标记为 @Inherited 会改变注释查询的工作方式。

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

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

@Repeatable

在 Java 8 中添加了 @Repeatable 元注释。它表示注释的多个实例可以附加到注释的目标。这个元注释没有价值。