使用objectweb asm字节码增加java值

vbkedwbf  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(357)

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

wsxa1bj1

wsxa1bj11#

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

相关问题