jvm dup指令

1 篇文章 0 订阅

创建并默认初始化一个Test类型的对象调用Test类的signature为 ()V 的构造器表达式的值为一个指向这个新建对家的引用。对应到字节码,我们可以看到:new Test 对应上面的(1)invokespecial Test.()V 对应上面的(2)然而(3)是怎么来的?再看实际的字节码: // operand stack:
// …
new Test // …, ref
dup // …, ref, ref
invokespecial Test.()V // …, ref可以看到,new字节码指令的作用是创建指定类型的对象实例、对其进行默认初始化,并且将指向该实例的一个引用压入操作数栈顶;然后因为invokespecial会消耗掉操作数栈顶的引用作为传给构造器的“this”参数,所以如果我们希望在invokespecial调用后在操作数栈顶还维持有一个指向新建对象的引用,就得在invokespecial之前先“复制”一份引用——这就是这个dup的来源。在上面的基础上,我们把这个引用保存到局部变量去,就有: // operand stack:
// …, ref
astore_1 // …
astore就会把操作数栈顶的那个引用消耗掉,保存到指定的局部变量去。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值