在接口Annotation中,
The common interface extended by all annotation types.
所有注释都是继承Annotation接口。
在熟知的Override 中:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
public @interface Override
可相当于
public interface Override extends Annotation
在annotation这个包中,依次查看注解接口:
@Documented 记录在javadoc中
@Inherited 自动继承注释类型。
@Native referenced from native code.
@Retention 保留范围(时间)
@Target 作用目标(位置)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
带有某种类型的注释将由javadoc和类似工具记录,如果用documentation注释类型声明,则它的注释成为被注释元素的公共API的一部分。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface Native {
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/**
* Returns the retention policy.
* @return the retention policy
*/
RetentionPolicy value();
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*/
ElementType[] value();
}
枚举 RetentionPolicy
- RetentionPolicy.SOURCE:当前注解编译期可见,不会写入 class 文件
- RetentionPolicy.CLASS:类加载阶段丢弃,会写入 class 文件
- RetentionPolicy.RUNTIME:永久保存,可以反射获取
枚举ElementType
- **ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上
- ElementType.FIELD:允许作用在属性字段上
- ElementType.METHOD:允许作用在方法上
- ElementType.PARAMETER:允许作用在方法参数上
- ElementType.CONSTRUCTOR:允许作用在构造器上
- ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上
- ElementType.ANNOTATION_TYPE:允许作用在注解上
- ElementType.PACKAGE:允许作用在包上
如何获取注解:
通过反射在AnnotatedElement或者AnnotatedElement的父类中可以获取。
-
isAnnotationPresent:判定当前元素是否被指定注解修饰
-
getAnnotation:返回指定的注解
-
getAnnotations:返回所有的注解
-
getDeclaredAnnotation:返回本元素的指定注解
-
getDeclaredAnnotations:返回本元素的所有注解,不包含父类继承而来的