Посетите второй верхний объект в стеке Java с помощью ASM

Я использую ASM для мониторинга доступа к полям (putfield и getfield). (Для putfield) Моя проблема заключается в том, что когда вершина стека является базовым значением (X), а вторая вершина является ссылкой на объект (Y), как я могу вставить некоторые инструкции Java для вызова моего метода со второй ссылкой на объект ( Y) в качестве одного аргумента, и после возврата из моего метода два (X и Y) не будут потеряны?

Таким образом, как я могу получить доступ ко второй верхней ссылке на объект, не затрагивая верхнее значение стека (после моего доступа) в Java на уровне байт-кода Java?

Я хочу использовать dup, но он может обрабатывать только верхнее значение стека. Итак, это работает для getfield, так как значения нет, и я могу напрямую дублировать его.

Есть ли лучший способ сделать это?

Спасибо.


person Life Thinker    schedule 10.10.2012    source источник


Ответы (1)


Случай 1... Базовое значение не Long или Double -

Допустим, вершина стека выглядит примерно так...

Y,X (крайний правый элемент является вершиной стека.)

Следующая последовательность инструкций должна помочь...

DUP2

POP

DUP2 будет дублировать две верхние инструкции. Таким образом, получается Y, X, Y, X. POP снимет X (базовое значение). И вы останетесь с Y, X, Y. И тогда вы можете вызвать свою функцию.

Случай 2... Базовое значение - Long или Double -

Вершина стека выглядит так... Y,X1,X2. Для этого вы можете использовать следующую последовательность инструкций...

DUP2_X1 // это приведет к X1,X2,Y,X1,X2

POP2 // это приведет к X1,X2,Y

DUP_X2 // это приведет к Y,X1,X2,Y

Таким образом, снова у вас есть Y на вершине стека. А под ним все так же, как и прежде.

В обоих этих случаях вы в конечном итоге получаете ссылку на объект (Y) наверху стека, что позволяет вам использовать его для любой операции по вашему выбору, например. вызов метода. После завершения этой операции состояние стека точно такое же, как и до выполнения манипуляций.

person vijay    schedule 11.10.2012
comment
Большое спасибо. Я думаю, что у меня появилась идея посетить второе значение в стеке из вашего ответа для обоих типов верхних значений. - person Life Thinker; 11.10.2012