Java字节码DUP

Lan*_*fee 9 java bytecode

我想知道为什么以下字节码中的异常(用于抛出异常)是重复的.

NEW java/lang/IllegalArgumentException
DUP
INVOKESPECIAL java/lang/IllegalArgumentException <init> ()V
ATHROW
Run Code Online (Sandbox Code Playgroud)

Ale*_*man 15

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

  1. NEW将新内容放入IllegalArgumentException堆栈[SomeIllegalArgumentException]
  2. DUP重复它[SomeIllegalArgumentException,SomeIllegalArgumentException]
  3. INVOKESPECIAL弹出顶部并通过调用它的<init>方法[SomeIllegalArgumentException]来初始化它(init方法不会返回要放回到堆栈的对象,因此必须首先复制对象以便将其保留在堆栈中)
  4. ATHROW抛出另一个(与我们初始化的一个重复)[]

  • 如果你更少考虑弹出并在堆栈上推送对象本身而不是讨论引用,这将更容易理解. (8认同)

Pet*_*rey 8

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

BTW构造函数<init>的内部名称是静态初始化程序代码的内部名称<clinit>