ByteBuddy - 如何添加局部变量

时间:2018-03-08 17:33:42

标签: java local-variables byte-buddy

我需要将局部变量添加到截取方法的生成主体中。

我试过(为了生成一个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修改局部变量表?

1 个答案:

答案 0 :(得分:0)

您必须为局部变量数组指定正确的大小。如果您需要额外的插槽,则必须指明appender的正确大小:

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

在上面的示例中,您似乎只为检测方法的值保留了位置。