java元注解及源码浅析

java元注解及源码浅析

@(Java)

首先,先看java.lang.annotation下的代码层次结构。如图所示:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值