Java ASM - 从AbstractInsnNode获取LabelNode

时间:2014-02-22 21:27:48

标签: java java-bytecode-asm

我一直在使用一些asm(使用Minecraft Forge的Transform类,但它不应该相关),但是我一直在使用NoClassDefFoundError和NullPointerException崩溃。我已经缩小了问题和理论解决方案的范围。

我正在尝试在操作数23处注入代码,但代码是包含跳转到代码中已存在于别处(在操作数68处)的标签。 (m是methodNode)

m.instructions.insert(m.instructions.get(23), ConfigPatch1());

要注入的代码:

InsnList toInject = new InsnList();
toInject.add(new VarInsnNode(ALOAD, 0));
toInject.add(new InsnNode(ICONST_0));
toInject.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/String", "charAt", "(I)C"));
toInject.add(new IntInsnNode(BIPUSH, 33));
toInject.add(new JumpInsnNode(IF_ICMPEQ, 68sLabelNode));
return toInject;        

最后一个添加应该在操作数68处具有LabelNode的标签。 我尝试过使用:

(LabelNode) m.instructions.get(68)

但后来我得到了“堆栈错误的操作数”错误;似乎表明演员阵容很糟糕。 get返回一个AbstractInsnNode。

如何从操作数68中获取LabelNode,以便在注射时使用它?

谢谢StackOverflow!

1 个答案:

答案 0 :(得分:0)

我不确定,但我认为你可以创建一个新的LabelNode并在指令#68之前插入它,然后跳转到它。

此外,使用InstructionAdapter比使用new直接创建说明更方便。