引言:在java后端的一些框架中,比如SpringMVC等等,都是运用注解注入,那注入之后我们怎么去提取注解的信息呢?这就要提到一个概念---反射
一:注解
首先,什么是注解?
注解,Annotation,也叫元数据。它是一种对代码进行的说明。它可以使用在类、字段、方法、变量,参数等等的前面,用于对这些元素进行修饰与说明。
其次,注解有什么用?
注解总共有以下三类作用: 1.编写文档,我们可以通过代码里的注解(元数据)生成文档;2.代码分析:我们可以使用反射,通过注解对他修饰的代码进行分析;3.编译检查,这个最常见的注解之一就比如@Override。。。通过注解让编译器能够完成一些基本的编译检查。
有哪几种注解?
按照注解的参数可以分为三类:没有参数的标记注解、有一个参数的单值注解、有多个参数的完整注解
元注解
我们知道,注解是用来描述代码的,那么元注解就是用来描述注解的,一边用来限制自定义注解的适用范围、生命周期等等
在jdk的java.lang.annotation包中定义了四个元注解:
@Target ---指定被修饰的注解的作用范围 ---例:FIELD用于描述属性、METHOD用于描述方法、CONSTRUCTOR.....
@Retention ---指定被修饰的注解的生命周期 ---RetentionPolicy.SOURCE:注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
@Documented ---指定被修饰的注解是可以被javadoc等工具文档化
@Inherited ---指定被修饰的注解修饰程序元素的时候是可以被子类继承的
二:反射
什么是反射机制?
是指程序在运行时能够获得自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。
反射机制的作用/ 提供了什么功能?
1。在运行时能够判断任意一个对象所属的类 - 对象.getClass()
2.在运行时构造任意一个类的对象 -Class.forName("全限类名") 例如:com.mysql.jdbc.Driver Driver类已经被加载到jvm中,并且完成了类的初始化工作就行了
3。类名.class,获取Class<?> clz对象
4.在运行时判断任意一个类所具有的成员变量和方法
5在运行时调用 任一对象的方法
哪里用到了反射机制?
1。各种框架用的最多的就是反射
2.加载驱动
3.读取配置文件
反射的优缺点?
优点:提高了程序的灵活性和扩展性,降低耦合性。它允许程序创建和控制任何类的对象,无需提前硬编码目标类
缺点:1.性能问题---用于字段和方法接入时要远慢于直接代码,因此反射机制主要应用于在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用 2.模糊程序内部逻辑,反射绕过了代码的技术,会带来维护问题,反射代码比相应的直接代码更复杂
三:使用反射机制提取注解信息
使用注解修饰了类、方法、变量等之后,这些注解不会自己生效,必须提供相应的工具来处理。想要获取类、方法、变量的注解信息,可以通过Java的反射机制来获取Annotation对象。
步骤:①:首先获取注解修饰的类的类对象 (Class<?> clazz = 类名.class)
②:通过注解对象获取注解的类对象 (clazz.getAnnotation(注解名.class))
未完待续。。。
目录