Java字节码DUP

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

NEW java/lang/IllegalArgumentException DUP INVOKESPECIAL java/lang/IllegalArgumentException  ()V ATHROW 

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

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

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

BTW构造函数的内部名称是 ,静态初始化代码的内部名称是