浅谈@Target作用目标限定+@Retention保留策略

122 阅读2分钟

@Target

让一个注解的作用目标只能在类上不能在方法上,这个就叫注解的作用目标限定。使用@Target注解可以达到作用目标限定的目的

image.png

我们点击@Target注解中的ElementType这个枚举类,看看可以使用哪些目标范围来限定

image.png

Target类型作用
ElementType.TYPE应用于类、接口(包括注解类型)、枚举
ElementType.CONSTRUCTOR应用于构造函数
ElementType.PARAMETER应用于方法的参数
ElementType.FIELD应用于字段或属性
ElementType.METHOD应用于方法
ElementType.PACKAGE应用于包
ElementType.LOCAL_VARIABLE应用于局部变量
ElementType.TYPE_PARAMETER1.8版本新增,应用于类型变量
ElementType.TYPE_USE1.8版本新增,应用于任何使用类型的语句中

下面我们来看下具体应用

这是我的自定义注解,作用目标限定为TYPE:类、接口(包括注解类型)、枚举 image.png image.png image.png

当作用在字段、构造函数、方法、方法的参数、局部变量时均报错 image.png

当把作用目标限定为CONSTRUCTOR:构造函数时,在构造函数上加自定义注解不再报错 image.png image.png

@Retention

保留策略指的是注解的保留策略,使用@Retention注解可以达到不同的保留策略 image.png

点击RetentionPolicy这个枚举类,可以看到有以下三种 image.png

Retention类型作用
RetentionPolicy.SOURCE注解只保留在源代码文件,当编译时,会被忽略,在字节码中是不会存在的。所以,反编译别人的源码,是不会存在注解的
RetentionPolicy.CLASS这种注解,在源代码中存在,然后编译时会把注解信息放在class文件中,但JVM在加载类的时候会忽略注解
RetentionPolicy.RUNTIME在源码文件中存在,在JVM加载的时候会把注解加载到JVM内存,这是唯一可反射注解

例如,我们使用RUNTIME类型,因为我们想使用反射