байт-код Java: два цикла for для onmethodExit - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть метод теста:

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

Итак, я хочу вставить два кода цикла for в метод, в новый список до и после, 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 голосов
/ 08 февраля 2013

В теме вы упомянули метод метадексита, из-за чего я догадываюсь, что вы используете AdviceAdapter для добавления кода в конец методов.Это хорошо.Я предполагаю, что код, который вы показали, был скопирован из метода onMethodExit ().

Однако в вашем коде вы, похоже, используете переменные adapter и mv - что содержит переменная "adapter"?Я предполагаю, что вам вообще не нужна переменная адаптера - вместо этого вызовите newLocal () непосредственно в методе onMethodExit ().

Если вы используете какой-то отдельный адаптер, который не связан должным образом, он, вероятно, "выделит"переменные, которые уже используются.

Так что без дополнительного кода, чтобы понять всю картину, я предлагаю: попробуйте изменить adapter.newLocal(Type.INT_TYPE) на newLocal(Type.INT_TYPE).

...