`
wensiqun
  • 浏览: 68962 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

    博客分类:
  • JVM
 
阅读更多
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将此时的栈顶值弹出存入局部变量中去。
分享到:
评论
1 楼 kabike 2015-12-07  
感觉需要dup是因为构造方法没有返回值

相关推荐

    Java虚拟机(字节码介绍)1

    总结起来,Java虚拟机的字节码指令集是执行Java代码的基础,它包含了数据操作、流程控制、对象操作、方法调用等各个方面,确保了Java程序的跨平台性和高效执行。理解和掌握这些指令对于深入理解Java的运行机制至关...

    《剑指offer》Java创建对象的五种方式.pdf

    在字节码层面,`new`指令在堆中分配内存,`invokespecial`调用构造器初始化对象。`dup`指令用于复制栈顶的引用,`astore`则将引用存储到局部变量表。 2. **使用`newInstance()`方法创建对象** 这个方法位于`java....

    JVM与性能优化知识点整理.pdf

    Java字节码指令是Java源代码经过编译后产生的中间代码,可以直接由JVM解释执行。 - **加载和存储指令**:这类指令用于加载和存储变量,如`iload`用于加载int类型的局部变量,`istore`用于存储int类型的局部变量。 -...

    JVM指令集.docx

    Java虚拟机(JVM)指令集是Java编程语言在运行时执行的基本操作单元,它构成了Java字节码的基础。这些指令允许JVM执行程序并管理内存。以下是对JVM指令集的一些关键点的详细说明: 1. **常量压入栈的指令**:这些...

    类实例化顺序讲解 附阿里巴巴一道笔试题

    1. **new对象底层字节码指令分析**:在Java字节码中,`new`指令用于创建一个对象,`dup`用于复制对象引用,`invokespecial`调用构造函数,`pop`用于弹出栈顶的引用,如果有多次`new`,则需要重复这些步骤。...

Global site tag (gtag.js) - Google Analytics