Зачем делать DUP при создании нового экземпляра - PullRequest
13 голосов
/ 02 сентября 2011

В настоящее время я нахожусь в проекте, который использует байт-код Java.Я обычно вижу, что при создании нового экземпляра класса и вызове метода для него, байт-код будет выглядеть так:

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

Вот почему следует делать «DUP»?Из VM Spec я получаю описание «Дублируем верхнее значение в стеке операндов и помещаем дублированное значение в стек операнда».Но почему дублирование верхнего значения в стеке операндов необходимо здесь?Спасибо.

1 Ответ

19 голосов
/ 02 сентября 2011

Поскольку INVOKESPECIAL будет использовать значение, созданное NEW из стека операндов, но вам может понадобиться использовать это значение, поэтому ссылка заранее дублируется.

...