自定义接口实现类似于枚举的功能
1 | import android.support.annotation.IntDef; |
@Retention限制存在的时间
@IntDef限制传入的数据。(@StringDef、@LongDef)
元注解
可以理解为最根本的注解,其他的注解是可以由此来衍生的,作用就是注解其他注解。
在Java5中有几个元注解:
@Target
说明Annotation所修饰的对象范围。用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
Annotation可被用于:
- packages
- types(类、接口、枚举、Annotation类型)
- 类型成员(方法、构造方法、成员变量、枚举值)
- 方法参数
- 本地变量(循环变量、catch参数等)
取值(ElementType)有:
- CONSTRUCTOR:用于描述构造器
- FIELD:用于描述域
- LOCAL_VARIABLE:用于描述局部变量
- METHOD:用于描述方法
- PACKAGE:用于描述包
- PARAMETER:用于描述参数
- TYPE:用于描述类、接口(包括注解类型)或者enum声明
@Retention
定义该Annotation被保留的时间长短:有些Annotation仅出现在源代码中,被编译器丢弃;有些被编译在class文件中;编译在class中的Annotation可能会被虚拟机忽略,也有在class被装载时被读取(PS:不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个
meta-Annotation
可以对Annotation的“生命周期”限制。作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPoicy)有:
- SOURCE:在源代码中有效。注解的信息会被编译器抛弃,不会留在class文件中
- CLASS:在class文件中有效。注解的信息被保留在class文件(字节码文件)中,但编译时不会被虚拟机读取在运行时。
- RUNTIME:在运行时有效。注解的信息被保留在class文件(字节码文件)中,当程序编译时,会被虚拟机保留在运行时。
@Documented
用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
@Inherited
是个标记注解。阐述某个被标记的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。
当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。