@Target
让一个注解的作用目标只能在类上不能在方法上,这个就叫注解的作用目标限定。使用@Target注解可以达到作用目标限定的目的
我们点击@Target注解中的ElementType这个枚举类,看看可以使用哪些目标范围来限定
| Target类型 | 作用 |
|---|---|
| ElementType.TYPE | 应用于类、接口(包括注解类型)、枚举 |
| ElementType.CONSTRUCTOR | 应用于构造函数 |
| ElementType.PARAMETER | 应用于方法的参数 |
| ElementType.FIELD | 应用于字段或属性 |
| ElementType.METHOD | 应用于方法 |
| ElementType.PACKAGE | 应用于包 |
| ElementType.LOCAL_VARIABLE | 应用于局部变量 |
| ElementType.TYPE_PARAMETER | 1.8版本新增,应用于类型变量 |
| ElementType.TYPE_USE | 1.8版本新增,应用于任何使用类型的语句中 |
下面我们来看下具体应用
这是我的自定义注解,作用目标限定为TYPE:类、接口(包括注解类型)、枚举
当作用在字段、构造函数、方法、方法的参数、局部变量时均报错
当把作用目标限定为CONSTRUCTOR:构造函数时,在构造函数上加自定义注解不再报错
@Retention
保留策略指的是注解的保留策略,使用@Retention注解可以达到不同的保留策略
点击RetentionPolicy这个枚举类,可以看到有以下三种
| Retention类型 | 作用 |
|---|---|
| RetentionPolicy.SOURCE | 注解只保留在源代码文件,当编译时,会被忽略,在字节码中是不会存在的。所以,反编译别人的源码,是不会存在注解的 |
| RetentionPolicy.CLASS | 这种注解,在源代码中存在,然后编译时会把注解信息放在class文件中,但JVM在加载类的时候会忽略注解 |
| RetentionPolicy.RUNTIME | 在源码文件中存在,在JVM加载的时候会把注解加载到JVM内存,这是唯一可反射注解 |
例如,我们使用RUNTIME类型,因为我们想使用反射