注释类型用定义@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 {} |
| 元素类型 | 目标 | 目标元素上的示例用法 |
|---|---|---|
| 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.加入元注释这表明注释的多个实例可以连接到注释的目标。此元注释没有值。