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

Eri*_*ang 13 java bytecode

目前我只是在一个使用java字节码的项目中.我经常看到,当创建一个新的类实例并在其上调用一个方法时,字节码将是:

NEW <MyClass>
DUP
INVOKESPECIAL <MyClass.<init>>
Run Code Online (Sandbox Code Playgroud)

这里为什么要做"DUP"?从VM Spec,我得到描述"在操作数堆栈上复制顶部值并将重复的值推送到操作数堆栈".但是为什么在这里需要复制操作数堆栈的最高值呢?谢谢.

Eug*_*hov 19

因为INVOKESPECIAL将消耗操作数堆栈中NEW创建的值,但您可能需要实际使用此值,因此提前重复引用.