一、java 反射的定义
定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,这种动态获取、调用对象方法的功能称为java语言的反射机制。
二、 Java代码的运行过程
首先程序员编写的代码会被编译成字节码,然后被JVM通过类加载器进行加载,接着再被解释器解释成机器码,然后分配执行这段指令需要的资源---主要是内存,然后就是CPU执行指令把结果写回内存了。
2.1 JVM编译为字节码
首先java是一门高级语言,这类语言并不能直接运行在硬件上,它必须运行在能够识别java语言特性的虚拟机上,而java代码必须通过java编译器将其转换为虚拟机能识别的指令序列,也称为java字节码。
2.2 解释器解释成汇编指令
有了字节码,java虚拟机通过类加载器进行加载,加载完之后,我们通过解释器解释成汇编指令,最终再转译成CPU可以识别的机器指令。
三、反射就是在JVM中操作对象。
反射是通过Class对象(字节码文件),来知道某个类的所有属性和方法。
反射的基本步骤:首先获得Class对象,然后实例化对象,获得类的属性、方法或者构造函数,最后访问属性、调用方法、调用构造函数创建对象。而Method类的invoke()方法就是用来执行指定对象的方法。
四、实列测试
4.1 获得Class对象
通过Class类中的静态方法 forName()方法获取(最为常见)。
public static void main(String[] args) throws Exception {
// 1.获取字节码对象
Class<FlowCalculate> clazz = (Class<FlowCalculate>) Class.forName("cn.iocoder.yudao.module.work.service.workService.FlowCalculate");
// 2.获取一个对象
Constructor con = clazz.getConstructor();
FlowCalculate calculate = (FlowCalculate) con.newInstance();
// 3.获取Method对象
Method method = clazz.getMethod("add", String[].class);
String[] s = new String[]{"1","3"};
// 4.调用invoke方法来调用
method.invoke(calculate, (Object) s);
}