`
wensiqun
  • 浏览: 67960 次
  • 性别: 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是因为构造方法没有返回值

相关推荐

    jvm-java字节码规则.pdf

    Java虚拟机(JVM)是运行Java程序的核心引擎,负责解释、执行Java字节码。Java字节码是一种中间语言,可以在任何安装了JVM的机器上运行,使得Java程序具有跨平台的能力。Java源代码在编译成.class文件时,会被编译器...

    Java lambda表达式和JVM字节码功能详解.pdf

    在Java字节码中,我们可以看到Lambda表达式是如何被转化为一个内部类`InnerClass$1`的,这个内部类实现了`Function`接口并重写了`apply`方法。字节码指令如`new`, `dup`, `invokespecial`和`putfield`等用于创建并...

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

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

    java虚拟机指令dup详解

    在 Java 中,dup 指令的使用非常频繁,例如在创建异常对象时,需要使用 dup 指令来复制对象的引用,以便将其传递给实例初始化方法。在创建集合对象时,dup 指令也可以用于复制集合的引用,以便将其传递给相关的方法...

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

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

    dup_dup2介绍

    在Linux操作系统中,`dup`和`dup2`是两个重要的系统调用,它们与文件描述符管理和进程间通信紧密相关。本文将详细介绍这两个函数的工作原理、使用场景以及如何用C语言实现它们。 首先,我们来看`dup`系统调用。`dup...

    dup源代码dup

    dup函数在系统编写程序的用法 及源代码

    DUP414中文驱动

    5. 完成安装后,设备管理器中应显示DUP-414设备,并且状态应为“已启用”。 6. 测试驱动程序,可以使用`4月重点工作日程安排表.xls`这样的文件,通过打印预览和实际打印来验证中文显示和处理是否正常。 总的来说,...

    文件描述符的复制:dup()和dup2()示例代码

    `dup()`成功时返回新的文件描述符,失败则返回-1,并设置`errno`错误码。 示例代码: ```c #include #include #include #include #include int main() { int fd1, fd2; fd1 = open("test.txt", O_RDWR |...

    dup 补丁 2.2汉化版

    总的来说,`dup 补丁 2.2汉化版`是一个为Diablo II玩家提供定制化游戏体验的工具,通过一系列的文件和接口,它实现了对游戏的深度修改,包括但不限于语言切换、规则设定、内存编辑等功能。使用这款补丁,玩家可以...

    UNIX编程中的dup和dup2说明

    dup2 函数的原型为 `int dup2(int oldfd, int targetfd)`, 它跟 dup 函数相似,但 dup2 函数允许调用者规定一个有效描述符和目标描述符的 id。dup2 函数成功返回时,目标描述符(dup2 函数的第二个参数)将变成源...

    Java字节码中的一些特定处理

    本文包括的一些描述为以下列表  · 常量池大小设定  · stackMapTable属性  · new指令后的dup  · attribute属性  · long和double的特殊处理  · monitorenter和monitorexit的使用场景  · ...

    dUP v2.17 Beta 23

    【描述】中的 "dUP v2.17 Beta 23 汉化版 by tracky" 表明这是一款处于测试阶段(Beta)的软件,版本号为2.17,由 tracky 进行了本地化处理,使得软件界面和文档适应中文环境。汉化工作对于非英语国家的用户至关重要...

    vb.net dup通信

    vb.net dup通信,含打洞技术,很有用,提供给大家学习。

    DUP 2.1 补丁编写工具

    【DUP 2.1 补丁编写工具】是一款专为IT专业人士设计的高效、易用的补丁制作软件。该工具支持多种类型的补丁创建,包括偏移量补丁、内存补丁以及文件补丁,能够满足不同场景下的修复和更新需求。在软件开发和维护过程...

    详细介绍dup2函数用法,一看必懂.。。。

    **示例**:假设 `oldfd` 的值为 1,当前最小可用文件描述符为 3,则 `dup` 函数执行后,文件描述符 3 将指向文件描述符 1 所指向的文件表项。 ##### 3.2 `dup2` 函数 `dup2` 函数的功能与 `dup` 类似,但它允许...

    【Java】从汇编码分析java对象的创建过程

    源码: class T { int m = 8; } T t = new T(); 汇编码: ...init是调用它的构造方法。 此时对象中的m值是8。 astore_1 将符号和对象建立关联,即t和堆中的对象。 其实很简单,今天看一个视频说了半天

    JVM指令查询手册.pdf

    Java虚拟机(JVM)是Java程序运行的核心组件,它负责解释和执行Java字节码。JVM指令集是JVM内部的工作语言,由一系列单字节的指令组成,每条指令都有特定的功能。这份“JVM指令查询手册”很可能包含了JVM的所有公共...

    DUP套接字客户端

    发送数据时,你需要构造一个`sockaddr_in`结构体,其中包含目标IP地址和端口号。然后,使用`sendto`函数将数据发送到指定的地址和端口。这个过程是异步的,数据可能会立即发送,也可能被缓存,取决于网络状况和操作...

Global site tag (gtag.js) - Google Analytics