引言
我们通常会在重写的代码上加上@Override来注明这是重写的方法,类似的还有@Test表示该方法是测试方法,这一种编写方式叫做注解,有的注解只起到注释的作用,可以省略,但有的则不行。
注解的定义
注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,以后,javac编译器、开发工具和其他程序可以通过反射来了解你的类及各种元素上有无标记,看你的程序有什么标记,就去干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量上定义。
使用场景
- 在代码中辅助说明代码的功能或者限定语法格式
例如:
重写方法时使用 @Override 限定子类方法格式
函数式接口使用 @FunctionnalInterface 限定接口格式
单元测试时用来标记方法使用 @Test
表示方法已经过时 @Deprecated - 在框架中配置数据
现在多数框架都基于注解进行配置
自定义注解
注解本质上就是一个接口,该接口默认继承Annotation接口,所以我们可以直接写一个注解
/**
* 自定义注解
*/
public @interface AnnotationDemo {
String name();
int age();
}
@AnnotationDemo(name="张三",age=19)
public class Demo {
@AnnotationDemo(name="张三",age=19)
private String people;
@AnnotationDemo(name="张三",age=19)
public void test(){
}
}
我们可以将注解作用在类,成员变量及方法上。之后就可以解析注解查看结果了
元注解
用来定义注解的注解,用来说明自定义注解的在类中出现的位置和生命周期
@Target
作用:定义该注解用在哪个位置,如果不写,默认是类中任何地方都可以使用。
可选的参数值在枚举类ElemenetType中包括:
TYPE: 用在类,接口上
FIELD:用在成员变量上
METHOD: 用在方法上
PARAMETER:用在参数上
CONSTRUCTOR:用在构造方法上
LOCAL_VARIABLE:用在局部变量上
@Retention
作用:定义该注解的生命周期
可选的参数值在枚举类型RetentionPolicy中包括:
SOURCE:注解只存在于Java源代码中,编译生成的字节码文件中就不存在了。
CLASS:注解存在于Java源代码、编译以后的字节码文件中,运行的时候内存中没
有,这个是默认值。
RUNTIME:注解存在于Java源代码中、编译以后的字节码文件中、运行时内存中,
程序可以通过反射获取该注解
解析注解
好了,我们开始写个实现类解析我们刚才的注解
public class Demo02 {
@Test
public void test(){
Class<Demo> demo=Demo.class;
AnnotationDemo annotationDemo=demo.getAnnotation(AnnotationDemo.class);
System.out.println(annotationDemo.name());
System.out.println(annotationDemo.age());
}
}
要注意:此时我们需要给自定义注解加上元注解
解析结果:
总结
一般解析步骤
1.通过反射获取被注解类的类对象
2.T getAnnotation(Class annotationClass)获得当前对象上指定的注解对象。
3.如果需要获取方法的注解则再获取对应的方法对象