/**
* java虚拟机规范——虚拟机编译器
* @java虚拟机是为了支持java编程语言而设计的!!
*
* @常量,局部变量和控制结构的使用
* java虚拟机是基于栈架构设计的,java虚拟机的大多数操作是从当前栈帧的操作数栈取一个或多个操作数
* 或将结果压入操作数栈中。每调用一个方法都会创建一个新的栈帧。并创建对应方法所需的操作数栈和局部变量表。
* 每个线程在运行的任意时刻,都会包含若干个由嵌套的方法调用而产生的栈帧,同时也会包含等量操作数栈。
* 但是只有当前栈帧中的操作数栈才是活动的。
*
* #隐式操作数让编译后的代码更简洁,更高效。
*
* @访问运行时常量池
* 很多数值常量,以及对象,字段,方法都是通过当前类的运行时常量池进行访问的。
*
* @方法调用
* 普通实例方法调用是在运行时根据对象类型进行分派的
* 这类方法调用通过invokevirtual指令实现,该指令都会带有一个表示索引的参数
* 运行时常量池在该索引处的项为某个方法的符号引用,这个符号引用可以提供方法所在对象的类型的内部二进制名称,方法名称和方法描述
*
* invokevirtual 指令的操作数不是类实例中方法指令的偏移量.
* 编译器并不需要了解类实例的内部布局,它只需要产生方法的符号引用并保存于运行常量池即可。
* 这些运行时常量池项会在执行时转换成调用方法的实际地址。
* 在java虚拟机指令集中,访问类实例的其他指令也采用相同的方式。
*
* invokestatic 用于调用类方法 和 实例调用编码区别在于 不需要传递this参数
*
* invokespecial 用于调用初始化方法,也用来调用父类方法和私有方法
* 所有invokespecial指令调用方法都需要以this作为首个参数,保存在首个局部变量中,编号为0的局部变量
*
* 如果编译器要调用某个方法句柄的目标,那么必须先产生这个方法的描述符
* 描述符记录了方法的实际参数和返回类型。方法描述符的语法正确,并且描述符中的类型名称可以正确解释
* 那么invokevirtual指令总是能够通过调用java.lang.invoke.MethodHandle的invokeExact 或invoke方法而连接到正确目标
*
*/
图一方法调用过程——来源《java虚拟机规范》