java虚拟机规范——虚拟机编译器——变量,控制结构,方法调用

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

在这里插入图片描述
图一方法调用过程——来源《java虚拟机规范》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

P("Struggler") ?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值