本文共 1280 字,大约阅读时间需要 4 分钟。
前面一篇学习注解快速入门,知道了注解作用目标,有在类,在方法,在局部变量等。这篇来学习注解的作用目标只限定在类或者方法上,然后学习注解的保留策略。
注解作用目标限定
让一个注解,它的作用目标只能在类上不能在方法上,这个就叫注解的作用目标限定。怎么给注解添加限定了,在定义注解的时候,使用@Target注解可以达到作用目标限定的目的。
看看有哪些类型,我们在IDE中搜索找到ElementType.class这个枚举代码,看看有在Target注解中可以使用哪些目标范围来限定。
TYPE
作用范围有,类,接口,包括注释类型还有枚举。
FIELD
这个单词叫字段的意思,作用范围有成员变量,就是类变量。
METHOD
作用范围限定在方法上
PARAMETER
单词是参数的意思,就是在一个方法传参的地方使用。
CONSTRUCTOR
单词是构造器的意思,作用范围限定在构造器
LOCAL_VARIABLE
作用在局部变量。
ANNOTATION_TYPE
作用在注解类型
PACKAGE
作用范围在包上
还有两个在JDK 1.8中定义的,参数类型和使用类型。
作用目标限定代码练习
练习1:只能作用类上,不能作用方法,ElementType值选择TYPE
限定了在类上,如果方法上使用了注解就报错。
练习2:只能作用方法上, ElementType值选择METHOD
练习3:同时方法和类都能用
这个不使用Target注解,默认全部都是可以作用在这些支持的地方,这里我们要求只能方法和类,其他不行。
在类和方法上可以使用注解,但是在成员变量上不行。
保留策略
先来解释下什么是保留策略,保留就是只注解的保留。下面有三种保留策略。
源代码文件注解(SOURCE):注解只保留在源代码文件,当编译时,会被忽略,在字节码中是不会存在的。所以,反编译别人的源码,是不会存在注解的。
字节码文件注解(CLASS):这种注解,在源代码中存在,然后编译时会把注解信息放在class文件中,但JVM在加载类的时候会忽略注解。
JVM中注解(RUNTIME):在源码文件中存在,在JVM加载的时候会把注解加载到JVM内存,这个是唯一可反射注解。
限定注解的保留策略
我们开发中使用的注解都是采用第三者注册策略,也就是JVM中注解。接下来我们来看看如何限定注解保留策略。
RetentionPolicy是一个枚举类型,里面有三个类型,分别对应上面介绍过的源码注解,字节码注解和JVM中注解。
例如,我们使用RUNTIME类型,因为我们想使用反射。
package annotation;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;@MyAnnotationpublic class Demo1 { }@Retention(RetentionPolicy.RUNTIME)@interface MyAnnotation{ }
转载地址:http://rmxws.baihongyu.com/