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