可以使用注解来保存类的相关信息以供反射调用
1、简介
提供一种为程序元素设置元数据的方法
2、功能
3、分类
3.1、元注解
3.1.1、Target
注解的作用目标
使用范围:
- packages、types(类、接口、枚举、Annotation类型)
- TYPE_PARAMETER--作用在范型类的实参之上
- PARAMETER--作用在普通参数上
- 类型成员(方法、构造方法、成员变量、枚举值)
- 本地参数和本地变量(如循环变量、catch参数)
3.1.2、Retention
标注注解被保留时间的长短,用于定义注解的生命周期
RetentionPolicy:
3.1.3、Documented
注解是否应当被包含在JavaDoc文档中(默认注解是不会被编译在JavaDoc中的)
3.1.4、Inherited
4、自定义注解
public @interface 注解名 {
修饰符 返回值 属性名() 默认值;
修饰符 返回值 属性名() 默认值;
...
}
:::warning
注意:
1、注解无法继承和实现接口的
2、修饰符不可用private和protected修饰
:::
4.1、注解属性支持的类型:
- 所有的基本数据类型:int,float,boolean,byte,double,char,long,short
- String类型
- Class类型
- Enum类型
- Annotation类型
- 以上所有类型的数组
4.2、注解底层实现
- JVM会为注解生成代理对象
4.3、注解工作原理
- 通过简直对的形式为注解属性赋值
- 编译器检查注解的使用范围,将注解信息写入元素属性表
- 运行时JVM将RUNTIME的所有注解属性取出并最终存入map里
- 创建AnnotationInvocationHandler实例并擦混入前面的map
- JVM使用JDK动态代理为注解生成代理类,并初始化处理器
- 调用invoke方法,通过传入方法名返回直接对应的属性值