为什么在创建新实例时创建DUP

问题描述:

目前我只是在使用java字节码的项目中。我经常看到,创建一个新的类的实例并调用它的方法时,字节码将是这样的:为什么在创建新实例时创建DUP

NEW <MyClass> 
DUP 
INVOKESPECIAL <MyClass.<init>> 

这里为什么要这么做“DUP”?从VM Spec中,我得到了“复制操作数堆栈顶部值并将重复值推送到操作数堆栈”的描述。但是为什么在这里重复操作数堆栈的最高值是必要的?谢谢。

由于INVOKESPECIAL将消耗由操作数堆栈中的NEW创建的值,但您可能需要实际使用此值,因此预先重复引用。