Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字节码DUP_Java_Bytecode - Fatal编程技术网

Java字节码DUP

Java字节码DUP,java,bytecode,Java,Bytecode,我想知道为什么下面字节码中的异常(用于引发异常)是重复的 NEW java/lang/IllegalArgumentException DUP INVOKESPECIAL java/lang/IllegalArgumentException <init> ()V ATHROW newjava/lang/IllegalArgumentException 重复 调用特殊的java/lang/IllegalArgumentException()V 阿思罗 在字节码中,对象首先由类创建,然

我想知道为什么下面字节码中的异常(用于引发异常)是重复的

NEW java/lang/IllegalArgumentException
DUP
INVOKESPECIAL java/lang/IllegalArgumentException <init> ()V
ATHROW
newjava/lang/IllegalArgumentException
重复
调用特殊的java/lang/IllegalArgumentException()V
阿思罗

在字节码中,对象首先由类创建,然后对该对象调用构造函数。构造函数的签名以
V
for
void
结尾,因为它返回任何内容。这意味着对对象的原始引用的副本必须保留在堆栈上(或变量中),以便在调用构造函数后抛出


顺便说一句,构造函数的内部名称是
,静态初始化器代码的内部名称是

,我将逐行分析,其中[]=使用该op后的新堆栈:

  • NEW将一个新的
    IllegalArgumentException
    放入堆栈[SomeIllegalArgumentException]
  • DUP复制它[SomeIllegalArgumentException,SomeIllegalArgumentException]
  • INVOKESPECIAL从顶部弹出,并通过调用其方法[SomeIllegalArgumentException]对其进行初始化(init方法不会返回要放回堆栈的对象,因此必须首先复制该对象,以便将其保留在堆栈上)
  • ATHROW抛出另一个(与我们初始化的重复)[]

  • 如果你不去想在堆栈上弹出和推送对象本身,而是谈论引用,这就更容易理解了
    NEW
    只分配object memeory而不调用任何构造函数,
    INVOKESPECIAL
    将调用一个构造,但该调用将从堆栈
    这个
    指针弹出,并且不推任何内容(构造函数返回
    void
    )。按照惯例,针对JVM的编译器将生成上面的
    NEW/DUP/INVOKESPECIAL
    序列来创建一个新对象。这是一个JVM可以识别的模式,可以进行特别优化。。。