定义注释类型
注释类型使用 @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
元注释。它表示注释的多个实例可以附加到注释的目标。这个元注释没有价值。