目录
反射分析类的能力Field、 Method 和 Constructor
为什么学习反射
开篇一定需要让同学们理解的是,为什么我们需要学习反射?
举个例子,平时我们创建对象的时候,是通过new的方式来创建。我们能new对象 是因为知道类的名字, 但是比如tomcat运行servlet.java 由于tomcat不知道servlet的类信息,无法通过人工new对象的这种方式来创建对象,就需要用到反射去获取类的信息
反射机制有什么用?
通过java语言中的反射机制可以操作字节码文件,也就是class文件
反射的基本概念
这种通过非new的方式,动态获取的信息以及调用对象的方法的功能称为java语言的反射机制
可以理解为对类的解,剖。只是获得它的字节码(class对象)
获取Class类实例化对象的方式
要操作一个类的字节码,首先要获取要这个类的字节码,那么怎么获取java.lang.Clss实例呢?
我们给出三种方式
1、Class.forName(“全类名”)
将字节码文件加载进内存,返回Class对象。
多用于配置文件,将类名定义在配置文件中。读取文件,加载类。
推荐使用这种方式。
2、类名.class
通过类名的属性class获取。
多用于参数的传递。
3、对象.getClass()
getClass()方法在Object类中定义着。
多用于对象的获取字节码文件的方式。
下面是演示:
反射分析类的能力Field、 Method 和 Constructor
获得了类的字节码文件之后 就可以开始获取里面的成员变量、方法和构造器的字节码信息了
java.lang.reflect.Field:代表类的成员变量,Field对象表示,某个类的成员变量java. lang.reflec.Method:代表类的方法,Method对象表示某个类的方法
java.lang.reflect.Constructor:代表类的构造方法,Constructor对象表示构造器
1、java.lang.reflect.Field
Field获取成员变量类信息,Field对象表示,某个类的成员变量java.
Field常用的四种方法
getField(String **) //需要传参 指定一个变量的接收 获取指定public类型的全局变量
getFields() //获取所有的public类型的全局变量的信息 需要用数组类型获取
getDeclareField() //Declare 忽略修饰访问符 获取类当中指定的全局变量
getDeclareFields() //获取类当中所有全局变量的信息 需要用数组类型获取 包括public private protect和不加任何修饰符的
通过下面的例子我们可以很好的理解:
输出结果:
2、java. lang.reflec.Method
Method:获取类方法的信息
用法其实和Field差不多
我们直接通过例子详细看一下吧
输出结果:
3、java.lang.reflect.Constructor
Constructor和Fleld、Method的方法几乎一样,只是Constructor获取的是构造器方法
我们知道,在调用对象的时候会执行对象的构造器方法,所以获取了构造器后,可以利用获取的构造器来创建对象
4、newInstance //利用获取的构造器创建对象
在这里涉及到一个知识点:暴力反射
暴力反射:当我们获取一个private类型的构造器的时候,我们无法通过反射获取,所以需要setAccessible(true)这个方法来设置一下,这样才能获取到private类型的构造器