2012-02-16 3 views
0

에 두 그래서자바 바이트 코드는 : 내가 시험 방법이에 대한 루프 onmethodExit

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

, 나는 이전과 이후 새로운 목록, 방법에 두 루프 코드를 삽입하려면, 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); 

첫 번째는 바로 새로운 클래스 파일에 있지만 초 동안 루프 같은 코드, 잘못하고 복귀 손실 :

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

있다 문제는, 대단히 감사합니다.

+0

for (int i = 0; i <10; i ++); 이것의 사용은 무엇입니까? (결국 세미 콜론에 주목하십시오)? .. 같은 줄에서 끝났습니다. –

+0

예, for (int i = 0; i <10; i ++); 코드가없고 비어있는 for 루프이며 두 개의 for 루프는 같지만 두 번째 비어있는 경우 오류가 발생합니다. returnValue는 이상한 변수에 할당됩니다. 참고 : onmethodExit 메소드의 ASM 코드 – user1212990

답변

0

주제에서 당신은 당신이 AdviceAdapter를 사용하여 메소드의 끝 부분에 코드를 추가한다고 생각하는 onmethodexit을 언급합니다. 이것은 좋은 일입니다. 당신이 보여준 코드가 onMethodExit() 메소드에서 복사되었다고 가정합니다.

그러나 코드에서 adaptermv 변수를 모두 사용하는 것 같습니다. "어댑터"변수에는 무엇이 들어 있습니까? 내 생각 엔 어댑터 변수가 필요 없다는 것입니다. 대신 onMethodExit() 메소드에서 직접 newLocal()을 호출하십시오.

제대로 연결되지 않은 별도의 어댑터를 사용하고 있다면 이미 사용중인 변수를 "할당"할 것입니다.

그럼 전체적인 그림을 이해할 수있는 더 많은 코드가 없으면 제 제안은 adapter.newLocal(Type.INT_TYPE)newLocal(Type.INT_TYPE)으로 변경해보십시오.