文章目录
理解注解,需要记得Java一切皆对象,底层都是一个个类写出来的
1. 注解分类
1.1. 元注解
Target:注解修饰的位置
Retention:注解对象的存活时间
1.2 JDK内置常用注解
1.3 自定义注解
注意要获取注解对象的参数值,必须你自定义的注解Retention生命周期是运行期 — 因为注解是利用反射获取二进制的属性值
自定义注解 – 切记别手动继承Annotation
// 注解可修饰方法、类
@Target({ElementType.METHOD, ElementType.TYPE})
@interface MyAnno {
public String name();
public String[] hobby();
}
使用自定义注解
@Anno(name = "lrc", hobby = { "蓝旗", "足球" })
public class Test8 {
@Anno(name = "ytr", hobby = { "桌球", "男人" })
public void a() {}
public static void main(String[] args) {
Class<Test8> clazz = Test8.class;
// 获取修饰Test8类的注解对象
Anno annos1 = (Anno)clazz.getDeclaredAnnotation(Anno.class);
System.out.printf("name:%s, hobby:%s", annos1.name(), Arrays.toString(annos1.hobby()));
System.out.println("\n\n=====================\n");
// 获取修饰Test8内的成员函数a的注解对象
try {
Method methodA = clazz.getMethod("a");
Anno annos2 = (Anno)methodA.getDeclaredAnnotation(Anno.class);
System.out.printf("name:%s, hobby:%s", annos2.name(), Arrays.toString(annos2.hobby()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果
2. 注解源码分析
2.1 Annotation - 注解接口
2.2 AnnotationInvocationHandler - 注解真正起作用的对象 - 代理对象、并利用反射
为什么利用反射实现注解?正因为能自定义注解,所以才用反射。当我们自定义注解是写了很多方法接口的,如果没有反射,JVM根本识别不了你写的方法接口。