我目前正在学习Java字节码,但我遇到了困难。
假设我有一个包含整数 currentPos 的超类。 我生成了一个必须生成子类并增加 currentPos 的方法,但不知何故它会引发堆栈下溢错误。
这是我的代码:
runMethod.instructions.add(new FieldInsnNode(GETFIELD, "me/looka/bfc/FooSuperClass", "currentPos", "I"));
runMethod.instructions.add(new InsnNode(ICONST_1));
runMethod.instructions.add(new InsnNode(IADD));
runMethod.instructions.add(new FieldInsnNode(PUTFIELD, "me/looka/bfc/FooSuperClass", "currentPos", "I"));
这应该通过以下步骤增加currentPos: 将当前值放入堆栈 将值1添加到堆栈中 将两个添加的值一起添加,将这两个值从堆栈中弹出并推送添加的值。 使用堆栈的当前值设置字段 弹出那个附加价值
答案 0 :(得分:1)
getfield
/ putfield
用于非静态字段。如果该字段是静态的,则需要getstatic
/ putstatic
。否则,您需要提供对象以引用其中的字段。假设所述对象位于本地插槽0中(通常保留此参数),您需要类似
runMethod.instructions.add(new VarInsnNode(ALOAD, 0));
runMethod.instructions.add(new VarInsnNode(ALOAD, 0));
runMethod.instructions.add(new FieldInsnNode(GETFIELD, "me/looka/bfc/FooSuperClass", "currentPos", "I"));
runMethod.instructions.add(new InsnNode(ICONST_1));
runMethod.instructions.add(new InsnNode(IADD));
runMethod.instructions.add(new FieldInsnNode(PUTFIELD, "me/looka/bfc/FooSuperClass", "currentPos", "I"));