什么是反射?
反射允许对成员变量,成员方法和构造方法的信息进行编程访问。
这么说可能比较抽象,可以简单理解为:反射就是一个人,可以把类里面的成员变量,成员方法,构造方法都获取出来。
并且可以获取到成员变量、构造方法、成员方法的所有信息。
对于成员变量:我们可以获取到它的 ①修饰符 ②属性名称 ③类型 ④ 获取变量值/赋值
对于构造方法:可以获取到①修饰符 ②形参 ③方法名 ,甚至还可以利用获取出来的方法创建对象。
对于成员方法:可以获取到①修饰符 ②形参 ③方法名 ④返回值 ⑤抛出的异常 ⑥注解 ,还可以运行获取出来的方法。
总的来说,利用反射,我们可以获取类里面的所有信息。
获取class对象的三种方式:
①: Class.forName("全类名") ②:类名.Class ③: 对象.getClass()
那么这三种方式我们该使用哪一种呢?
其实这3种方式对应着Java里面3种不同的阶段,如果创建一个类的对象,分为以下3个阶段:
①:把java文件编写成class字节码文件。(源代码阶段,还没有把代码加载到内存中,在硬盘中进行操作) 此时,我们可以使用方式①
②:在运行代码前,要先把字节码文件加载到内存中。(加载阶段) ----方式②
③:在内存中,可以创建类的对象,比如:A a = new A(); (运行阶段) ----方式③
一般是这样使用,并不绝对。
利用反射获取构造方法:
Constructor类中用于创建对象的方法:
T newInstance(Object... initargs): 根据指定的构造方法创建对象,上面的getDeclaredConstructors()方法虽然可以获取所有的构造方法,但是不能使用私有的构造方法来创建对象。先要取消自动检查:setAccessible(true)。
利用反射获取成员变量:
利用反射获取成员方法: