2017-02-15 14 views
0

Я пытаюсь захватить значения переменных, участвующих в условном выражении ветвления и цикла отчетности, например:Javassist захватить локальные значения переменных для конкретных утверждений

if (a + b < c - 5) { // here, capture value of a, b and c 
    // if body 
} 

for (int i = 0; i/x < 4 ; i++){ // here, capture value of i and x on exit of loop 
    // for body 
} 

ли Javassist обеспечить ExpressionEditor для если, переключатель, для и в то время как такие утверждения, как это делают для FieldAccess, MethodCall, Handler и т. д.?

Есть ли другой подход к этой проблеме? (Мне интересно это делать во время выполнения)

+0

Javassist does - кроме предлагаемого - позволяет выполнять итерацию по всем инструкциям по коду. Из работы с Javassist и ASM я, тем не менее, предлагаю вам заглянуть в ASM, который лучше подходит для этих форм преобразований. –

ответ

1

Я действительно не думаю, что это возможно, с Javassist вы не можете пойти и посетить это глубоко в ByteCode.

Ваши потребности слишком мелкие и библиотека не поддерживает его, как вы можете видеть из документа this, который вы можете получить доступ ко всем переменным, которые являются параметрами метода или возврату метода, но вы ничего не можете найти обо всех другие переменные.

Если я могу предложить что-то, вы должны взглянуть на ASM. Я не эксперт по этому поводу, но, как я знаю, и согласно документации this, необходимо предоставить более глубокий взгляд на байт-код.