Java注解备忘
基本概念
注解,Annotation,是在JDK 1.5 及后续版本引入的一个特性,可以声明在类,字段,方法等前面,用来对这些元素进行说明和注释。
一、元注解
Java中定义了一些元注解,用来对其他annotation进行说明,主要包括有如下四个:
- @Target
- @Retention
- @Documented
- @Inherited
下面我们对每一个元注解的作用及常用参数进行说明。
1. @Target
该元注解用来描述注解的使用范围,即被标识的注解能够用在什么地方。常用的取值如下:
- CONSTRUCTOR:构造器
- FIELD:域
- LOCAL_VARIABLE:局部变量
- METHOD:方法
- PACKAGE:包
- PARAMETER:参数
- TYPE:类、接口(包括注解类型) 或enum声明
2. @Retention
该元注解用来定义Annotation的保留时长。
某些Annotation仅出现在源代码中,而被编译器丢弃;而一部分Annotation会被编译在class文件中。
常用的取值如下:
- SOURCE:在源文件中有效(源文件保留),当Java文件编译成class文件时,注解被丢弃。
- CLASS:在class文件中有效(class保留),当class文件被加载时丢弃。
- RUNTIME:在运行时有效(运行时保留)
显然生命周期长度:SOURCE < CLASS < RUNTIME。
生命周期选择
对于注解生命周期的选择可以参考如下使用:
- 如果需要在运行时去动态获取注解信息,则只能使用RUNTIME。
- 如果是需要在编译时进行一些预处理操作(如本文的APT),则可以选择使用CLASS。
- 如果只是做一些检查性的操作,如@Override 和@SuppressWarnings,则可以使用SOURCE。
3. @Documented
此元注解表明这个注解应该被 javadoc工具记录.
默认情况下,javadoc是不包括注解的.
但如果声明注解时指定了 @Documented
,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中,是一个标记注解,没有成员。
4. @Inherited
@Inherited 元注解是一个标记注解,阐述了某个被标注的类型是被继承的。
如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
效果
-
类继承关系中@Inherited的作用
类继承关系中,子类会继承父类使用的注解中被@Inherited修饰的注解
-
接口继承关系中@Inherited的作用
接口继承关系中,子接口不会继承父接口中的任何注解,不管父接口中使用的注解有没有被@Inherited修饰
-
类实现接口关系中@Inherited的作用
类实现接口时不会继承任何接口中定义的注解
二、自定义注解
自定义注解可以使用@interface
来处理,用来自动继承java.lang.annotation.Annotation接口
,由编译程序自动完成其他细节,代码格式如下:
元注解
public @interface 注解名 {
定义体
}
注解参数的可支持数据类型:
- 所有基本数据类型(int,float,boolean,byte,double,char,long,short)
- String类型
- Class类型
- enum类型
- Annotation类型
- 以上所有类型的数组
Annotation类型的参数设置
参数可以遵循如下使用:
- 只能使用
public
或者默认default
这两个访问权限修饰 - 参数成员只能用基本类型
- byte
- short
- char
- int
- long
- float
- double
- boolean
- String,Enum,Class,annotations等数据类型
- 如果只有一个参数成员,最好把参数名称设为"value",后加小括号.
定义了注解之后需要生成注解处理器来对注解进行处理,如采用APT技术。