1

ASM 사용자 설명서 (http://download.forge.objectweb.org/asm/asm4-guide.pdf)의 112 페이지에있는 위임 예를 따르려고합니다.ASM Tree API가 InsnList에 삽입되어 StackOverflowError가 발생합니까?

class MyMethodAdapter extends MethodVisitor { 
    MethodVisitor next; 
    public MyMethodAdapter(int access, String name, String desc, 
          String signature, String[] exceptions, MethodVisitor mv) { 
     super(
      Opcodes.ASM4, 
      new MethodNode(access, name, desc, signature, exceptions) 
     ); 
     next = mv; 
    } 

    @Override public void visitEnd() { 
     MethodNode mn = (MethodNode) mv; 

     mn.instructions.insert(new MethodInsnNode(INVOKESTATIC, "runtime/Recorder", "checkBytecodes", "()V")); 


     mn.accept(next); 
    } 
} 

불행하게도, 내가 그것을 실행할 때, 실패 : 지금까지 나는 다음과 같다 뭔가가 아마도 mn.instructions.insert( 라인이 존재하는 경우에만 발생

*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ../../../src/share/instrument/JPLISAgent.c line: 844 
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ../../../src/share/instrument/JPLISAgent.c line: 844 

Exception: java.lang.StackOverflowError thrown from the UncaughtExceptionHandler in thread "main" 

, 그래서 나머지를 내 변환 파이프 라인이 작동합니다. 내가 여기서 누락 된 것이 있습니까? 나는 문자 그대로 // put your transformation code here 영역에 변형을 가하고 있으며 그 결과 오류는 완전히 이해할 수 없다.

add() 메서드의 명령 목록 끝 부분에 대한 지침은 정상적으로 실행되는 것처럼 보이지만, 원하는 것은 아닙니다. 새 정적 호출을 메서드 본문에서 가장 먼저 사용하고 싶습니다.

답변

0

스택 추적이 없으면 이것이 ASM API와 관련이 있는지 말할 수 없습니다.

당신은 여전히 ​​사용하여 명령 목록의 시작 부분에 전화를 삽입 할 수 있습니다

mn.instructions.insertBefore(mn.instructions.getFirst(), 
    new MethodInsnNode(INVOKESTATIC, "runtime/Recorder", "checkBytecodes", "()V")); 
관련 문제