0

私はテスト方法を持っています:

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

そのため、メソッドに2つの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 ループは正しいですが、2 番目の for ループは正しくなく、リターンが失われます。コードは同じです。

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

どこに問題がありますか、どうもありがとう

4

1 に答える 1

0

トピックでは、onmethodexitについて言及しています。これにより、AdviceAdapterを使用してメソッドの最後にコードを追加していると推測されます。これは良いことです。あなたが示したコードはonMethodExit()メソッドからコピーペーストされたと思います。

ただし、コードでは変数adaptermv変数の両方を使用しているようです。「アダプター」変数には何が含まれていますか?私の推測では、アダプタ変数はまったく必要ありません。代わりに、onMethodExit()メソッドで直接newLocal()を呼び出します。

適切にチェーンされていない別のアダプターを使用している場合は、すでに使用されている変数を「割り当てる」可能性があります。

したがって、全体像を理解するためのコードがこれ以上ない場合、私の提案は次のとおりadapter.newLocal(Type.INT_TYPE)ですnewLocal(Type.INT_TYPE)

于 2013-02-07T20:51:25.110 に答える