2014-10-06 7 views
1

는 말한다 :ASM 바이트 코드 조작 - <a href="http://asm.ow2.org/asm50/javadoc/user/index.html" rel="nofollow">documentation</a>으로 ISTORE 및 istore_ <n>

공용 인터페이스 옵 코드

JVM이 옵 코드, 액세스 플래그 및 배열 유형 코드를 정의합니다. 이 인터페이스는 일부 opcode가 자동으로 처리되기 때문에 모든 JVM opcode 을 정의하지 않습니다. 예를 들어, 가능하면 xLOAD 및 xSTORE opcode가 xLOAD_n 및 xSTORE_n opcode로 자동 대체됩니다. xLOAD_n 및 xSTORE_n opcode는이 인터페이스에 정의되어 있지 않으므로 입니다. LDC의 경우와 마찬가지로 자동으로 이 LDC_W 또는 LDC2_W로 대체됩니다 (WIDE, GOTO_W 및 JSR_W).

질문 :

나는 두 개의 거의 동일한 class 파일이있는 경우 - 명시 적 피연산자 istore_<n>istore를 사용하여 하나. Asm은 항상 명시 적 피연산자로 istore이 있음을 ClassReader 및 ClassVisitor에 알립니다. 나는 asm을 사용하고 싶지만이 차이에 대해 알아야합니다. asm으로 어떤 명령의 실제 연산 코드를 얻을 수 있습니까?

+2

다른 라이브러리를 사용할 수 있습니다. – Antimony

답변

1

ASM의 ClassWriter는 가능한 가장 효율적인 ISTORE opcode를 사용합니다. ISTORE 1을 출력하면 ASM은 ISTORE_1을 출력합니다.

이 때문에 ClassReader는 opcode를 원래 형식을 숨기는 일반 형식으로 "분해"합니다. 일반적으로 ISTORE 1이 원래 ISTORE_1이었던 것으로 가정하는 것이 안전하지만 원래의 바이트 코드의 실제 형태가 ASM에 의해 손실되는 다른 경우가 있습니다. 원래의 바이트 코드를 그대로 검사하려면 javassist를 사용하는 것이 좋습니다.

+0

네,하지만 소프트웨어를 만들 필요가 있습니다. 예를 들어 두 클래스 사이의 차이점을 보여줄 수 있습니다 (한 클래스가 istore_1와 istore 1을 사용하는 차이조차도) – Krab

+0

편집 된 답글보기. –

+0

in javassist 필자가 직접 피연산자를 읽어야 할 것입니다 :/ – Krab