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