2011-09-02 79 views
12

目前我只是在使用java字節碼的項目中。我經常看到,創建一個新的類的實例並調用它的方法時,字節碼將是這樣的:爲什麼在創建新實例時創建DUP

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

這裏爲什麼要這麼做「DUP」?從VM Spec中,我得到了「複製操作數堆棧頂部值並將重複值推送到操作數堆棧」的描述。但是爲什麼在這裏重複操作數堆棧的最高值是必要的?謝謝。

回答

19

由於INVOKESPECIAL將消耗由操作數堆棧中的NEW創建的值,但您可能需要實際使用此值,因此預先重複引用。