Java 注解概念:
Java 注解(Annotation)是 JDK5.0 引入的一种注释机制,一种代码级别的说明,主要给计算机看的。
注解与类、接口、枚举是在同一个层次,它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
JDK内置注解:
Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
作用在代码的注解是:
- @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
- @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
- @SuppressWarnings - 指示编译器去忽略注解中声明的警告。
作用在其他注解的注解(或者说 元注解)是:
- @Retention - 描述注解被保留的阶段,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
- @Documented - 标记这些注解是否包含在用户文档中。
- @Target - 标记这个注解应该是哪种 Java 成员。
- @Inherited - 描述注解是否被子类继承
从 Java 7 开始,额外添加了 3 个注解:
- @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
- @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
- @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。
三个核心类:
- Annotation - 所有注解都继承Annotation接口
- ElementType - 注解种类枚举,在Target上使用,表明可以作用在什么元素上面(一个注解可以有多个ElementType)
- RententionPolicy - 保持策枚举,在@Retention上使用,表明注解的作用范围(一个注解只能有一个RententionPolicy)
注解类反编译:
annotation架构图:
自定义注解语法格式:
注意:
- 注解中的属性通过一个与属性名相同的方法体现,类似平时编码的get方法,且该方法返回值只能是:基本数据类型、String、枚举、注解与以上三种类型的数组
- 如果注解定义了属性,除非使用default关键字给属性默认初始化值,否则在使用时需要给属性赋值
注解赋能:
可以通过反射或aop(本质还是反射) 的方式,使注解实现某些功能,如api日志记录或api鉴权等。
aop:
本文主要对aop的方式进行介绍,通过aop能够很简便地为注解进行赋能,其原理主要是将注解作为一个切入点,进行代码拦截,然后将需要实现的功能织入其中
程序中读取注并获取定义的属性值:
反射:
1. 获取注解定义的位置的对象 (Class,Method,Field)
2. object.getAnnotation(annotation)获取指定的注解
aop:
注意:获取注解其实就是在内存中生成了一个该注解接口的实现对象(一个POJO)