我需要将局部变量添加到截取方法的生成主体中。
我试过(为了生成一个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修改局部变量表?
答案 0 :(得分:0)
您必须为局部变量数组指定正确的大小。如果您需要额外的插槽,则必须指明appender的正确大小:
new ByteCodeAppender.Size(
size.getMaximalSize(),
methodDescription.getStackSize() + 1
);
在上面的示例中,您似乎只为检测方法的值保留了位置。