java字节码构造对象为什么需要dup命令


package jvm.study;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
Test t = new Test();
}

}



这段代码所产生的字节码如下

// Compiled from Test.java (version 1.6 : 50.0, super bit)
public class jvm.study.Test {

// Method descriptor #6 ()V
// Stack: 1, Locals: 1
public Test();
0 aload_0 [this]
1 invokespecial java.lang.Object() [8]
4 return
Line numbers:
[pc: 0, line: 3]
Local variable table:
[pc: 0, pc: 5] local: this index: 0 type: jvm.study.Test

// Method descriptor #15 ([Ljava/lang/String;)V
// Stack: 2, Locals: 2
public static void main(java.lang.String[] args);
0 new jvm.study.Test [1]
3 dup
4 invokespecial jvm.study.Test() [16]
7 astore_1 [t]
8 return
Line numbers:
[pc: 0, line: 9]
[pc: 8, line: 10]
Local variable table:
[pc: 0, pc: 9] local: args index: 0 type: java.lang.String[]
[pc: 8, pc: 9] local: t index: 1 type: jvm.study.Test
}

这里可以看到其中main方法主要做的

0 new jvm.study.Test [1]
3 dup
4 invokespecial jvm.study.Test() [16]
7 astore_1 [t]
8 return

这里有个dup指令。其作用就是复制之前分配的jvm.study.Test空间的引用并压入栈顶。那么这里为什么需要这样么做呢?因为invokespecial指令通过[16]这个常量池入口寻找到了jvm.study.Test()构造方法,构造方法虽然找到了。但是必须还得知道是谁的构造方法,所以要将之前分配的空间的应用压入栈顶让invokespecial命令应用才知道原来这个构造方法是刚才创建的那个引用的,调用完成之后将栈顶的值弹出。
之后调用astore_1将此时的栈顶值弹出存入局部变量中去。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值