[注解]-自定义注解
1.0 @Retention
1.1概述
介绍:称为元注解,也就是注解的注解 java.lang.annotation.Retention
形态可以在定义Annotation
注解时,指示编译程序如何对待自定义的Annotation
形态。
@Retention
包含一个属性value
,是 RetentionPolicy
的类型,它的数据类型是枚举类Enum
,通过枚举类的值来决定Retention
注解如何保持,也就是Rentention
与 RententionPolicy
一起使用。
1.2 作用
- 配置和
RetentionPolicy
有3个值:
CLASS
、RUNTIME
、 SOURCE
;
- 按照使用决定了注解使用的时期:
生命周期:RetentionPolicy.SOURCE
:
注解只保留在java源文件,当Java文件编译成class文件的时候,注解被遗弃;RetentionPolicy.CLASS
:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;RetentionPolicy.RUNTIME
:注解不仅被保存到class文件中,jvm加载,就是内存字节码 ,其他反射机制的代码进行读取和使用。
1.3 使用
- 选择合适的类型:
生命周期长度 :SOURCE < CLASS < RUNTIME
-
场景:
a. RUNTIME : 般如果需要在运行时去动态获取注解信息
b. CLASS:编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife)
c. SOURCE 注解 : 如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings
2.0@Target
2.1概述
此注解说明注解的作用目标,默认值为任何元素。
为这个 value 传值:
`@Target(value = {ElementType.FIELD})`
- 如果注解中有一个名称为value的属性,且你只想设置value的属性(即其他属性都采用默认值或者只有一个value属性),那么可以省略value=部分。
- 数组属性中只有一个元素,这时候属性值部分可以省略大括@Target(value={ElementType.TYPE})可以省略value=部分,由于数组只有一个元素,所以可以省略大括号。简写成@Target(ElementType.TYPE)
2.2属性
- ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上
- ElementType.FIELD:允许作用在属性字段上
- ElementType.METHOD:允许作用在方法上
- ElementType.PARAMETER:允许作用在方法参数上
- ElementType.CONSTRUCTOR:允许作用在构造器上
- ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上
- ElementType.ANNOTATION_TYPE:允许作用在注解上
- ElementType.PACKAGE:允许作用在包上