java注解变量_【Java基础】注解
⼀.注解的⽤处和实现原理
1.⽤处
注解Annotation的出现是为了简化Xml配置带来的复杂性,注解是⼀种元数据(描述数据的数据),它是⼀种在运⾏时被读取或写⼊的⼀种特殊标记,⽤以描述数据的特性或者读取到数据的值。
2.实现原理
注解的实现原理和动态代理⼀样都是基于反射。
⼆.元注解
元注解是Java中⽤于实现⾃定义注解的元数据,⽤户⾃定义的注解都需要通过元注解来进⾏描述才能⽣效。
1.@Retention
⽤于指定被修饰的Annotation可以保留多长时间,只能修饰Annotation定义。@Retention包含⼀个RetentionPolicy类型的value成员变量,使⽤@Retention必须为该value成员变量指定值。value成员变量的值有3个选择:
RetentionPolicy.CLASS:编译器将把Annotation记录在class⽂件中。当运⾏java程序时,JVM不可获取Annotation信息。(默认值)
RetentionPolicy.RUNTIME:==编译器将把Annotation记录在class⽂件中。当运⾏java程序时,JVM也可获取Annotation信息,程序可以通过反射获取该Annotation信息。==
RetentionPolicy.SOURCE:Annotation只保留在源代码中(.java⽂件中),编译器直接丢弃这种Annotation。
//注解保留到运⾏时,可以通过反射获取到该注解
@Retention(RetentionPolicy.RUNTIME)
public @interface DemoAnnotation {}
2.@Target
⽤于指定被修饰到Annotation可以修饰哪些类型。
- @Target(ElementType.ANNOTATION_TYPE):指定该该策略的Annotation只能修饰Annotation.
- @Target(ElementType.TYPE) //接⼝、类、枚举、注解
- @Target(ElementType.FIELD) //成员变量(字段、枚举的常量)
- @Target(ElementType.METHOD) //⽅法
- @Target(ElementType.PARAMETER) //⽅法参数
- @Target(ElementType.CONSTRUCTOR) //构造函数
- @Target(ElementType.LOCAL_VARIABLE)//局部变量
- @Target(ElementType.PACKAGE) ///修饰包定义
- @Target(ElementType.TYPE_PARAMETER) //java8新增
- @Target(ElementType.TYPE_USE) ///java8新增
3.@Documented
⽤于指定被修饰的Annotation将被javadoc⼯具提取成⽂档。即说明该注解将被包含在javadoc中。
4.@Inherited
⽤于指定被修饰的Annotation具有继承性。即⼦类可以继承⽗类中的该注解。
三.注解成员变量
在注解中可以设置注解的成员变量,以便之后获取到该注解的特定所需数据:
/
*
* @Author ARong
* @Description 使⽤@interface关键字定义注解
* @Param
* @return
**/
// 注解保留到运⾏时,可以被反射所解析
@Retention(RetentionPolicy.RUNTIME)
// 注解修饰对对象可以是类、接⼝与枚举类型
@Target(ElementType.TYPE)
// 注解可以被编⼊⽂档
@Documented
// 注解可以被继承
@Inherited
public @interface DemoAnnotation {
// 以⽅法签名定义注解的成员变量
int id() default 1;// 定义默认值
String name();
}
使⽤注解
/**
* @Auther: ARong
* @Description: 测试⾃定义注解
*/
@DemoAnnotation(id = 6, name = "HelloWorld")
public class TestDemoAnnotation {
}
四.提取注解数据
使⽤注解的最主要⽬的之⼀就是在运⾏时提取注解中所含有的数据,以⽤于完成其他的操作。那么要如何获取到注解的数据呢?⾸先要知道的是,所有的注解的⽗接⼝都为java.lang.Annotation接⼝,所以只需要通过反射,在运⾏时动态地获取到Annotation接⼝,再将Annotation接⼝转换为具体的注解类,然后就可以通过注解类中⾃定义的成员变量(也就是成员⽅法)去获取到注解中的信息了。
1.AnnotationElement接⼝
AnnotationElement接⼝位于flect包下,实现它的类就表明可以通过反射获取到该类的注解信息,⽽实现了该接⼝的类有:AccessibleObject
Class
Constructor
Executable
Field
Method
Package
Parameter
所以可以先使⽤反射获取到上述的类,然后通过这些就可以调⽤AnnotationElement接⼝规定的⽅法来获取和该类相关的代码
了,AnnotationElement接⼝有规定了以下⼏个常⽤的⽅法:
T getAnnotation(Class annotationClass) :获取该元素指定的注解,如果该注解不存在则返回null
T getAnnotation(Class annotationClass)
Annotation[] getAnnotations():获取该元素所有的所有注解
Annotation[] getAnnotations()
default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) : 判断该元素上是否含有该注default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
解。
Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注解。
Annotation[] getDeclaredAnnotations()
T getDeclaredAnnotation(Class annotationClass):返回直接修饰该程序元素的指定类型的注解,不存在则返回 null。
T getDeclaredAnnotation(Class annotationClass)
(java8新增)
2.获取类上的注解并提取注解中的数据
/**
* @Auther: ARong
* @Description: 测试⾃定义注解
*/
@Deprecated
@DemoAnnotation(id = 6, name = "HelloWorld")
public class TestDemoAnnotation {
/*
* @Author ARong
* @Description 获取类上的注解并提取数据
* @Param
* @return
**/
@Test
public void testGetClassAnnotationMessage() {
// 反射获取到类
Class<TestDemoAnnotation> clazz = TestDemoAnnotation.class;
Annotation[] annotations = Annotations();
for (Annotation annotation : annotations) {
System.out.String());
if (annotation instanceof DemoAnnotation) {
java配置用户变量
/
/ 将Annotation转化为为DemoAnnotation并提取数据
System.out.println(((DemoAnnotation) annotation).id());
System.out.println(((DemoAnnotation) annotation).name());
}
}
}
}
输出
@java.lang.Deprecated()
@thinking_in_java.annotation_learn.DemoAnnotation(id=6, name=HelloWorld) 6
HelloWorld
五.⾃定义注解
有⼀篇⽂章讲得很好,这⾥就不赘述了:
Java注解⼊门介绍_lb850747906的博客-CSDN博客b log.csdn

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。