ByteBuddy — как добавить локальную переменную

Мне нужно добавить локальную переменную в сгенерированное тело перехваченного метода.

Я пробовал (чтобы создать переменную int):

List<StackManipulation> statements = new ArrayList();

statements.add(IntegerConstant.forValue(false));
statements.add(MethodVariableAccess.INTEGER.storeAt(3));

...

StackManipulation logic = new StackManipulation.Compound(statements.toArray(new StackManipulation[0]));

StackManipulation.Size size = new StackManipulation.Compound(logic).apply(methodVisitor, context);

return new ByteCodeAppender.Size(size.getMaximalSize(), methodDescription.getStackSize());

но это дает мне

java.lang.VerifyError: переполнение таблицы локальных переменных.

Конечно, в таблице локальных переменных эта переменная уже должна быть.

Чтобы обойти это, я теперь создаю дополнительные параметры метода, которые действуют как локальные переменные, что, конечно, неудобно.

Итак, как я могу изменить таблицу локальных переменных с помощью ByteBuddy?


person user466540    schedule 08.03.2018    source источник


Ответы (1)


Вы должны указать правильный размер массива локальных переменных. Если вам требуется дополнительный слот, вы должны указать правильный размер для аппендера:

new ByteCodeAppender.Size(
  size.getMaximalSize(), 
  methodDescription.getStackSize() + 1
);

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

person Rafael Winterhalter    schedule 10.03.2018