java - ByteBuddy - 如何添加局部变量

标签 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: Local variable table overflow.

当然,局部变量表应该已经有这个变量了。

为了解决这个问题,我现在创建额外的方法参数来充当局部变量,这当然不方便。

那么,如何使用 ByteBuddy 修改局部变量表?

最佳答案

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

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

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

关于java - ByteBuddy - 如何添加局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49179137/

相关文章:

java - 尝试设置数据绑定(bind)时出错

python - 从 multiprocessing.Process 继承的 Python 类的设置值问题

java - 显示生成的 bytebuddy 字节码

java - 为什么 ASM 不调用我的 `` VisitCode``?

java - libsvm 适用于多输出回归吗?

java - 从挂起/hibernate 状态恢复计算机后如何告诉 ScheduledExecutorService 忽略重叠执行

Javascript,使用一个本地对象而不是许多本地变量

c - 从函数返回局部变量

java - 字节好友可以在运行时创建字段和方法注解吗?

java - Android应用程序菜单设计