Java字节码DUP

时间:2012-09-15 15:16:49

标签: java bytecode

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

NEW java/lang/IllegalArgumentException
DUP
INVOKESPECIAL java/lang/IllegalArgumentException <init> ()V
ATHROW

2 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:8)

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

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