2013-02-20 2 views
2

Java 바이트 코드를 생성하는 데 ASM을 사용하고 있습니다. 기본적으로 모든 종류의 메서드를 추가 후 처리로 재정의 할 수있는 동적 프록시를 만들 필요가 있습니다. 나는 그것을 모두 할 수 있지만 좋은 방법으로하는 방법을 볼 수없는 한 가지가 있습니다.ASM : 유형에 따라 적절한 Opcode를 쉽게 얻는 방법

난 아무것도 할 수있다 무시하고 메서드의 첫 번째 매개 변수의 유형, 그래서는 ASM 코드에서 ALOAD을 사용할 수 없습니다,하지만 난 ILOAD, LLOAD, FLOAD 등 내 질문을 사용할 필요가 있습니다 기반 내가로드 할 매개 변수 유형에 쉽게 유효한 LOAD 명령 오피 알 수있는 방법이있다, 그래서 내가 좋아하는 뭔가를 할 필요가 없습니다 :

if (parameterType == int.class) 
    mv.visitVarInsn(ILOAD, 1); 
else if 
    ... 
else 
    mv.visitVarInsn(ALOAD, 1); 
+0

어떤 코드를 생성하려고합니까? 인수를로드하고 즉시 다른 함수를 호출합니까? – Antimony

+0

사실,이 단계에서는 맞습니다. 다른 메소드 호출 및 호출 후 콜백 실행 (동일한 메소드에서) –

답변

2

parameterType 가정하면 유형 Class 또는 유형 String이다 형식 설명자 (예 : "I" 또는 "Ljava/lang/String;")를 포함하는 경우 :

import org.objectweb.asm.Type; 

... 

Type parameterAsmType = Type.getType(parameterType); 
int opcode = parameterAsmType.getOpcode(Opcodes.ILOAD); 
mv.visitVarInsn(opcode, 1); 

다른 opcode에 대해서도 마찬가지입니다. 자세한 내용은 Type.getOpcode() javadoc을 참조하십시오.

+0

일반적으로 ASM과 함께 제공되는 GeneratorAdapter 클래스 사용을 고려할 수 있습니다. 여기에는 내가 수행하는 메소드를 포함하여 좋은 헬퍼 메소드가 많이 포함되어 있습니다. 위에 나타냈다. –

+0

그것이 그 것이다. 감사! –

관련 문제