2013-07-23 6 views
1

Я хочу просмотреть аргументы для вызовов методов. Так что, если я называю Foo:Доступ к переменным/константам в вызове метода

x = 4; 

y = 5; 

... 

foo(x, y, 20, 25); 

Я хочу напечатать аргументы (4,5,20,25) я понимаю эти аргументы в стек перед тем, вызывается метод. Как получить значение (если инициализировано или константа) из локального массива переменных метода?

visitVarInsn() и VarInsnNode не имеют возможности искать фактическое значение из массива.

Должен ли я использовать анализатор и интерпретатор, чтобы сделать это, или есть более простой способ?

EDIT: Выяснено, как это сделать. Я изменил BasicValue и BasicInterpreter для учета аргументов инструкции байткода. Значения, представляющие такие инструкции, как BIPUSH, содержат информацию о том, что значение выбрано, а не только информацию о типе. Frames рассматривается так же, как с анализатором

+0

Какая проблема вы пытаетесь решить? – Bohemian

+0

Вы хотите узнать аргументы статически во время компиляции (без запуска программы) или во время выполнения? (Второй намного проще) – ruediste

+0

Мне нужно найти их статически. Мне нужно только знать, инициализированы ли они или нет, а также начальное значение – zaz

ответ

0

это не связанно с ассемблерной и байткодом манипуляции, но только в том случае -

если метод Foo относится к классу с методом интерфейса Foo вы можете использовать Proxy, чтобы обернуть реализацию интерфейса и перехватить имена методов.

Кроме того, вы можете найти this ответ полезным для модификаций байт-кода ASM.

1

Постоянные числовые значения, передаваемые непосредственно вызову метода (20 и 25), легко извлекаются статически - они приведут к нажатиям инструкций, которые вы можете прочитать в visitIntInsn. Меньшие значения приведут к инструкциям const, которые вы можете уловить с помощью посещенияInsn, большие значения могут быть пойманы с помощью посещенияLdcInsn.

Я не считаю, что вообще можно определить значения, связанные с переменными в точке вызова метода статически. Вам необходимо будет выполнить анализ потока данных (используя, например, Analyzer и Interpreter), которые должны быть в состоянии предоставить диапазон возможных значений для каждой переменной. Это не даст вам определенных значений в общем случае, но будет в конкретных случаях переменных, которые назначаются только один раз или назначаются несколько раз, но безоговорочно.

Смежные вопросы