使用Objectweb ASM字节码增加Java Fied值

时间:2015-01-15 14:19:03

标签: java bytecode java-bytecode-asm

我目前正在学习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添加到堆栈中 将两个添加的值一起添加,将这两个值从堆栈中弹出并推送添加的值。 使用堆栈的当前值设置字段 弹出那个附加价值

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"));