注解的注解称为元注解。
public enum RetentionPolicy {
/**
* 若 Annotation 的类型为 SOURCE,则意味着:Annotation 仅存在于编译器处理期
* 间,编译器处理完之后,该 Annotation 就没用了。 例如," @Override" 标志就是
* 一个 Annotation。当它修饰一个方法的时候,就意味着该方法覆盖父类的方法;并且在
* 编译期间会进行语法检查!编译器处理完后,"@Override" 就没有任何作用了。
* APT,编译时生成辅助类
*/
SOURCE,
/**
* 若 Annotation 的类型为 CLASS,则意味着:编译器将 Annotation 存储于类对应
* 的 .class 文件中,它是 Annotation 的默认行为。
* 字节码增强 热修复
*/
CLASS,
/**
* 若 Annotation 的类型为 RUNTIME,则意味着:编译器将 Annotation 存储于
* class 文件中,并且可由JVM读入。
* 反射
*/
RUNTIME
}
public enum ElementType {
TYPE, /* 类、接口(包括注释类型)或枚举声明 */
FIELD, /* 字段声明(包括枚举常量) */
METHOD, /* 方法声明 */
PARAMETER, /* 参数声明 */
CONSTRUCTOR, /* 构造方法声明 */
LOCAL_VARIABLE, /* 局部变量声明 */
ANNOTATION_TYPE, /* 注释类型声明 */
PACKAGE /* 包声明 */
}
属性
如果一个注解内仅仅只有一个名字为 value 的属性时,应用这个注解时可以直接把属性值填写到括号内。
public @interface Check {
String value() default "1";
}
上面代码中,Check 这个注解只有 value 这个属性,所以可以这样应用。
@Check("hi")
int a;
这和下面的效果是一样的:
@Check(value="hi")
int a;