java元注解及源码浅析
@(Java)
首先,先看java.lang.annotation下的代码层次结构。如图所示:
其中比较主要的为一个接口,四个annotation类型和两个枚举类
Interface
Annotation
查看源码中对于Annotation的注释,无需多说。
被所有annotation类型继承的通用接口。如果一个接口手动继承这个了这个接口,并不意味着该接口就是annotation类型。同时注意这个接口也不能定义自身为annotation类型。
其中一个需要注意的方法,返回annotation类型。
/**
* Returns the annotation type of this annotation.
*/
Class<? extends Annotation> annotationType();
Enum
ElementType
一个枚举类型。提供了对elements的分类,是跟Target元注解一块使用的。为了指明是否是合法使用的annotation。
/** 类,接口(包括annotation 类型),或者枚举的声明 */
Type/** 字段的声明(包括enum的常量) */
FIELD/** 方法的声明 */
METHOD/** 参数的声明 */
PARAMETER/** 构造函数的声明 */
CONSTRUCTOR/** 本地变量的声明 */
LOCAL_VARIABLE/** 注解类型的声明 */
ANNOTATION_TYPE/** 包的声明 */
PACKAGE
RetentionPolicy
annotation的保留策略,跟Retention一块使用,用来指明annotation能保留多久
/** annotation将会在编译期间被丢弃 */
SOURCE/** annotation在编译期间会被保留在class文件中,在VM运行时不会被保留。这个是默认的行为 */
CLASS/** annotation在编译期间会被保留在class文件中,以及VM运行中,所以这个是可被放射的。 */
RUNTIME
Annotation Type
Documented
表明用于被它描述annotation能被类似javadoc的工具文档化。如果是由Documented注解的类型,那么这些类型就会成为注释元素的公共API的一部分。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
由上面源码可知,其自身也使用了@Documented注解
Inherited
表明annotation类型是自动继承的。如果一个Inherited元注解是当前注解的声明,同时用户在类声明中查询这个注解类型,如果该类没有该类型的注解类型,那么会自动查询这个类的父类的注解类型。这个过程会持续到直到找到这个类型,或到达了该类层次结构的顶层 (Object) 为止。如果超类没有这个注解的类型,那么查询会表明这个类没有这个的注解。
注意这个元注解类型对除了注解类以外的任何其他事物是无效的。注意这个元注解只被促成从超类继承注解;被实现的接口注解是无效的。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
Retention
表明annotation能被保留多久。如果当前的annotation没有声明Retention注解,那么保留策略就是默认的RetentionPolicy.CLASS。
一个Target元注解只有直接用于注释时才会生效。如果一个元注解的类型被用于另一个注解类型的成员则是无效的。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
Target
指示注释类型所适用的程序元素的种类,如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
有错误请指教。对于一些源码中注释翻译不准确,请见谅,并希望能及时改正。
参考:
http://tool.oschina.net/apidocs/apidoc?api=jdk-zh
http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html