1. 注解概述
- 从JDK5.0开始,Java增加了对元数据(描述数据的数据称之为元数据)的支持,也就是Annotation(注释)
- Annotation其实就是代码里的特殊标记,
这些标记可以在编译,类加载,运行时被读取,并执行相应的处理
。通过使用Annotation,程序员可以在不改变原有逻辑的情况下
,在源文件中嵌入一些补充信息。 Annotation可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明
,这些信息被保存在Annotation的“name=value”对中。- Annotation能被用来为程序元素(类,方法,成员变量等)设置元数据。
2. 基本的Annotation
- 使用Annotation时要在其前面增加@符号,并把该Annotation当成一个修饰符使用。用于修饰它支持的程序元素。
- 三个基本的Annotation:
- @Override:限定重写父类方法,该注释只能用于方法
- @Deprecated:用于表示某个程序元素(类、方法)已过时
- @SuppressWarnings:抑制编译器警告
3. 自定义Annotation
- 定义新的Annotation类型使用@interface关键字
Annotation的成员变量在Annotation定义中以无参数方法的形式来声明。其方法名和返回值定义了该成员的名字和类型。
- 可以在定义Annotation的成员变量时为其指定初始值,指定成员变量的初始值可使用default关键字
- 没有成员定义的Annotation称为标记;包含成员变量的Annotation称为元数据Annotation。
4. 提取Annotation信息
- JDK5.0在java.lang.reflect包下新增了AnnotatedElement接口,该接口代表程序中可以接受注释的程序元素
- 当一个Annotation类型被定义为运行时Annotation后,该注释才是运行时可见,当class文件被载入时保存在class文件中的Annotation才会被虚拟机读取
- 程序可以调用AnnotationElement对象的如下方法来访问Annotation信息
- getAnnotation(Class annotationClass)
- Annotation[] getAnnotations()
- Annotation[] getDeclaredAnnotations()
- boolean isAnnotationPresent(Class
5. JDK的元Annotation
- JDK的元Annotation用于修饰其他Annotation定义
- @
Retention
:只能用于修饰一个Annotation定义,用于指定该Annotation可以保留多长时间,@Retention包含一个RetentionPolicy类型的成员变量,使用@Retention时必须为该value成员变量指定值:
- RetentionPolicy.CLASS:编译器将把注释记录在class文件中,当运行Java程序时,JVM不会保留注释。这就是默认值。
RetentionPolicy.RUNTIME:编译器将把注释记录在class文件中。当运行Java程序时,JVM会保留注释。程序可以通过反射获取注释
。- RetentionPolicy.SOURCE:编译器直接丢弃这种策略的注释。
Target
:用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰那些程序元素,@Target也包含一个名为value的成员变量。- @Documented:用于指定被改元Annotation修饰的Annotation类将被Javadoc工具提取文档。
- @Inherited:被它修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注释。