为什么要在创建新实例时进行 DUP

2022-09-04 19:43:55

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

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

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


答案 1

因为 INVOKESPECIAL 会消耗 NEW 从操作数堆栈创建的值,但您可能需要实际使用此值,因此引用会提前复制。


答案 2

推荐