反射:
先分析下Java代码在计算机中经历的阶段:
第一阶段:我们写的Java程序,也就是类,xx.java 文件,通过javac编译后,成为 xx.class 的字节码文件,这个阶段是源代码阶段。
第二阶段:xx.class文件,通过类加载器,将类的各种成员封装成class类对象,比如 成员变量放在Field数组中,构造方法放在Constructor数组中,成员方法放在Method数组中,这是Class类对象阶段
第三阶段:我们就可以具体的创建对象了,进入Runtime 运行时阶段。
反射:将类的各个组成部分封装成其他对象,这就是反射机制。
好处:1、可以在程序运行过程中操作这些对象。2、解耦,提高程序可扩展性。
获取字节码class对象的方式:
1、Class.forName("全类名") :将字节码文件加载到内存,返回Class对象
多用于配置文件,将类名定义在配置文件中。
2、类名.class :通过类名的属性class获取。
多用于参数的传递。
3、对象.getClass() .
多用于对象的获取字节码的方式。
Class对象功能:
获取功能:
获取成员变量们:
Field[] getFields() Field[] getField(String name) 获取public的成员
Field[] getDeclaredFields() Field[] getDeclaredField(String name) 获取所有的成员
setAccessible(ture) 暴力反射,忽略访问修饰符的安全检查。
操作: 设置值: void set(Object obj, Object value) 获取值:get(Object obj)
获取构造方法们:
Constructor<?>[] getConstructors() ..............
操作:创建对象:T newInstance(Object...initargs) 如果用空参的构造方法,可以简化:
用Class对象的newInstance 方法。
获取成员方法们:
Method[] getMethods() ............................
操作:执行方法:Object invoke(Object obj,Object...args) 获取名称:String getName