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
forvoid
结尾,因为它返回任何内容。这意味着对对象的原始引用的副本必须保留在堆栈上(或变量中),以便在调用构造函数后抛出
顺便说一句,构造函数的内部名称是
,静态初始化器代码的内部名称是
,我将逐行分析,其中[]=使用该op后的新堆栈:
IllegalArgumentException
放入堆栈[SomeIllegalArgumentException]如果你不去想在堆栈上弹出和推送对象本身,而是谈论引用,这就更容易理解了
NEW
只分配object memeory而不调用任何构造函数,INVOKESPECIAL
将调用一个构造,但该调用将从堆栈这个指针弹出,并且不推任何内容(构造函数返回void
)。按照惯例,针对JVM的编译器将生成上面的NEW/DUP/INVOKESPECIAL
序列来创建一个新对象。这是一个JVM可以识别的模式,可以进行特别优化。。。