我一直在使用一些asm (使用Minecraft的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!
发布于 2014-02-23 14:26:44
我不确定,但我认为您可以创建一个新的LabelNode,并将其插入到指令#68之前,然后跳转到它。
而且,使用InstructionAdapter比直接使用new创建指令更方便。
https://stackoverflow.com/questions/21960813
复制相似问题