我需要将局部变量添加到拦截方法的生成主体中。
我已经尝试过(为了生成 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: Local variable table overflow.
当然,局部变量表应该已经有这个变量了。
为了解决这个问题,我现在创建额外的方法参数来充当局部变量,这当然不方便。
那么,如何使用 ByteBuddy 修改局部变量表?
最佳答案
您必须为局部变量数组指定正确的大小。如果您需要额外的插槽,则必须指定附加程序的正确大小:
new ByteCodeAppender.Size(
size.getMaximalSize(),
methodDescription.getStackSize() + 1
);
在上面的示例中,似乎您只为检测方法的值保留位置。
关于java - ByteBuddy - 如何添加局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49179137/