一 反射简介
反射是JAVA的高级特性。
反射就是在运行状态能够动态的获取该类的属性和方法 并且能够任意的使用该类的属性和方法这种获取类信息以及动态的调用对象的方法的功能就是反射
二 实现方式:
实现上面 的操作的前提是能够动态的获取到该类的字节码对象
- 类名.class
- 对象.class
- Class.forName(全类名)获取
三反射执行过程
.java->编译.class->加载到JVM中(类加载器加载)->.class文件对应一个class对象->class对象->获取方法
我们看过JVM的相关书籍都会详细的了解到,Java文件首先要通过编译器编译,编译成Class文件,然后通过类加载器(ClassLoader)将class文件加载到JVM中。
在JVM中Class文件都与一个Class对象对应,在因为Class对象中包含着该类的类信息,只要获取到Class对象便可以操作该类对象的属性与方法。
在这里深入理解反射之前先来深入的理解Class对象,它包含了类的相关信息。
Java中我们在运行时识别对象和类的信息,也叫做RTTI,方式主要有来两种:
传统的RTTI(Run-Time Type Information)
反射机制
那么什么是RTTI呢?RTTI称为运行时类型识别,传统的RTTI是在编译时就已经知道所有类型;而反射机制则是在程序运行时才确定的类型信息。
想要运行时使用类型信息,就必须要获取Class对象的引用,获取Class对象的方式上面已经提及。
这里有点区别的就是使用(.class)方式获取Class对象,并不会初始化Class对象,而使用(forName(“全类名”))的方式会自动初始化Class对象。
当一个.class文件要被加载到JVM中的时候,会进行如下的准备工作,首先会检查这个类是否被加载,若是没有被加载就会根据全类名找到class文件,接着加载Class文件,并创建类的静态成员引用。
但是在程序中并非是一开始就完全加载该类的class文件,而是在程序用的地方再加载,即为懒加载模式。
当加载完Class文件后,接着就会验证Class文件中的字节码,并静态域分配存储空间。这个过程也叫做链接。
最后一步就是进行初始化,即为了使用类而提前做的准备工作如下图所示:
加载->连接->初始化
三
反射对应JAVA类库 就是java.lang.reflect下 在该包下包含着Field METHOD 和constructor 类
Field 表示一个