为什么要在创建新实例时进行 DUP
目前我只是在一个使用java字节码的项目中。我通常看到,当创建一个新的类实例并在其上调用一个方法时,字节码将如下所示:
NEW <MyClass>
DUP
INVOKESPECIAL <MyClass.<init>>
这里为什么要做“DUP”?从VM Spec中,我得到了描述“复制操作数堆栈上的最高值,并将重复的值推送到操作数堆栈上”。但是,为什么这里需要复制操作数堆栈上的最高值呢?谢谢。
目前我只是在一个使用java字节码的项目中。我通常看到,当创建一个新的类实例并在其上调用一个方法时,字节码将如下所示:
NEW <MyClass>
DUP
INVOKESPECIAL <MyClass.<init>>
这里为什么要做“DUP”?从VM Spec中,我得到了描述“复制操作数堆栈上的最高值,并将重复的值推送到操作数堆栈上”。但是,为什么这里需要复制操作数堆栈上的最高值呢?谢谢。
因为 INVOKESPECIAL 会消耗 NEW 从操作数堆栈创建的值,但您可能需要实际使用此值,因此引用会提前复制。