java字节码:onmethodExit上的两个for-loop

时间:2012-02-16 05:00:38

标签: java bytecode java-bytecode-asm

我有一个测试方法:

public List<User> getUsers(){
List list = new ArrayList();
return list;
}

所以,我想在方法中插入两个for-loop代码,之前和之后的新列表,asm代码相同:

final int returnValueStackNum = adapter.newLocal(Type.INT_TYPE);
mv.visitInsn(Opcodes.ICONST_0);
mv.visitVarInsn(Opcodes.ISTORE, returnValueStackNum);
final Label l0 = new Label();
mv.visitJumpInsn(Opcodes.GOTO, l0);
final Label l1 = new Label();
mv.visitLabel(l1);
mv.visitIincInsn(returnValueStackNum, 1);
mv.visitLabel(l0);
mv.visitVarInsn(Opcodes.ILOAD, returnValueStackNum);
mv.visitIntInsn(Opcodes.BIPUSH, 10);
mv.visitJumpInsn(Opcodes.IF_ICMPLT, l1);

第一个for循环在新的类文件中是正确的,但第二个for循环是错误的并且返回丢失,代码相同:

List list = new ArrayList();
for (int i = 0; i < 10; i++);
int j = 0;
tmpTernaryOp = localArrayList;
while (j < 10)
   j++;

问题出在哪里,非常感谢

1 个答案:

答案 0 :(得分:0)

在主题中你提到onmethodexit,这让我猜你正在使用AdviceAdapter将代码添加到方法的末尾。这很好。我假设你展示的代码是从onMethodExit()方法中复制的。

但是在您的代码中,您似乎同时使用了adaptermv变量 - “adapter”变量包含哪些内容?我的猜测是你根本不需要适配器变量 - 而是直接在onMethodExit()方法中调用newLocal()。

如果你使用的是一个没有正确链接的独立适配器,它可能会“分配”已经在使用的变量。

因此,如果没有更多代码来了解整体情况,我的建议是:尝试将adapter.newLocal(Type.INT_TYPE)更改为newLocal(Type.INT_TYPE)