본문 바로가기

기술스택/ASM - [Bytecode]

[ASM Docs]MethodVisitor 하위 메서드들 Docs를 통해 알아보기

https://asm.ow2.io/javadoc/org/objectweb/asm/MethodVisitor.html#visitParameter(java.lang.String,int)

 

MethodVisitor (ASM 9.6)

Direct Known Subclasses: AnalyzerAdapter, CheckMethodAdapter, CodeSizeEvaluator, InstructionAdapter, LocalVariablesSorter, MethodNode, MethodRemapper, TraceMethodVisitor public abstract class MethodVisitor extends Object A visitor to visit a Java method. T

asm.ow2.io

 

전체 메서드들을 기재하였으나, 주관적으로 분류하였음.

 

 

1. 메서드 및 필드 접근

1-1. visitFieldInsn: 클래스 필드 조작

void visitFieldInsn(int opcode, String owner, String name, String descriptor)

 

클래스나 인터페이스의 필드를 로드하거나 저장하는데 사용된다. = 필드를 읽거나 쓸 때 필요한 바이트코드 지시어를 삽입하는 데 사용

지역 변수와 달리, 클래스 내에 존재하는 필드 값에 가깝다.

 

1. opcode : 

GETSTATIC 명령은 정적 필드의 값을, GETFIELD 명령은 객체의 필드 값을 스택에 푸시한다.

*(정적 필드 : 클래스 레벨에서 선언되어, 해당 클래스의 모든 인스턴스에 대해 공유되는 필드, 즉 static을 의미)

PUT의 경우는 반대로 스택에서 필드로 값을 가져온다.

 

2. owner : 필드가 속한 class나 interface의 이름

3. name : 필드의 이름

4. descripter : 필드의 타입을 설명자 형태로 게시

 

 

1-2. visitMethodInsn: 클래스의 메서드 호출

public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface)

 

클래스의 메서드를 호출할 때 사용된다.

이 메서드는 메서드 호출에 필요한 바이트코드 지시어를 삽입하는 데 사용한다.

 

- visitMethodInsn에서 메서드 호출 시 : 필요한 파라미터들이 스택에서 pop된다.

- 메서드의 결과(리턴 값이 있을 경우) :  return 값을 스택에 푸시하는 효과가 있다.

 

  1. opcode(int)
    - INVOKEVIRTUAL : 인스턴스 메서드를 호출할 때 사용. "objectInstance.method()"와 같이 인스턴스 메서드를 호출
    - INVOKESPECIAL : 특수 메서드 호출로, 주로 '생성자' 호출에 사용. 슈퍼 클래스의 생성자를 호출하는 경우나, private 메서드를 호출하는 경우에도 사용 가능
    - INVOKESTATIC : 클래스 수준의 정적(static) 메서드를 호출할 때 사용 : "ClassName.staticMethod()" 
    - INVOKEINTERFACE : 인터페이스 메서드 호출 시 사용 : "interfaceInstance.interfaceMethod()"
  2. owner(String): 호출되는 메서드가 속한 클래스 또는 인터페이스의 내부 이름(internal name), ex : "java/lang/String"
  3. name(String): 호출되는 메서드의 이름
  4. desc(String): 호출되는 메서드의 설명자(descriptor)
  5. itf(boolean): 호출되는 메서드가 인터페이스의 메서드인지 여부

1-3. visitInvokeDynamicInsn : invokedynamic(동적 호출) 관련 생성

public void visitInvokeDynamicInsn(String name,
 String descriptor,
 Handle bootstrapMethodHandle,
 Object... bootstrapMethodArguments)
public void visitInvokeDynamicInsn(String name, String descriptor, Handle bootstrapMethodHandle, Object... bootstrapMethodArguments)
Visits an invokedynamic instruction.

Parameters:name - the method's name.descriptor - the method's descriptor (see Type).bootstrapMethodHandle - the bootstrap method.bootstrapMethodArguments - the bootstrap method constant arguments. Each argument must be an IntegerFloatLongDoubleStringTypeHandle or ConstantDynamic value. This method is allowed to modify the content of the array so a caller should expect that this array may change.

 

컴파일 시간이 아니라 런타임 시간에 메서드가 결정되는 "동적으로 호출되는 메서드"를 생성하는 데 사용된다.

이는 정적으로 코드에 메서드 이름을 명시하지 않고, 런타임에 결정되는 방식을 의미한다.

 

  1. name(String): 생성할 메서드의 이름
  2. descriptor(String): 생성할 메서드의 설명자(descriptor)
  3. bootstrapMethodHandle(Handle): 바이트코드 생성 시 호출되는 부트스트랩(bootstrap) 메서드를 나타내는 Handle 객체. 부트스트랩 메서드는 동적으로 생성된 메서드의 호출에 대한 동적 매핑을 처리한다.
  4. bootstrapMethodArguments(Object...): 부트스트랩 메서드에 전달되는 인수들의 배열. 이러한 인수들은 부트스트랩 메서드가 호출될 때 전달되며, 동적 매핑에 사용된다.

 

2. 변수 및 스택 조작

2-1. visitVarInsn: 지역 변수에서 값을 꺼내거나 저장

public void visitVarInsn(int opcode, int varIndex)

 

  1. opcode(int): 지역 변수 관련 바이트코드 지시문의 종류를 나타내는 opcode. 
    - LOAD는 지역 변수의 값을 스택에 푸시하고, STORE명령은 스택에서 값을 POP하여 지역 변수에 저장.
    - 앞의 변수는 타입을 나타낸다. ex : ILOAD - Int 불러오기(Operands stack)
  2. var(int): 지역 변수의 인덱스(index).

2-2. visitIincInsn: 지역 변수에 대한 증감 연산

public void visitIincInsn(int varIndex, int increment)

 

 

직접적으로 스택을 사용하지 않지만, 지역 변수의 값을 변경하는데 사용된다.

  1. var(int): 증가 또는 감소할 지역 변수의 인덱스(index). 
  2. increment(int): 지역 변수를 증가 또는 감소시킬 값

 

2-3. visitIntInsn: 특정 int 값을 스택에 푸시하는 명령어(BIPUSH, SIPUSH).

public void visitIntInsn(int opcode, int operand)

정수형 상수를 스택에 로드하거나, 바이트코드에서 특정 연산을 수행할 때 사용된다.

  1. opcode(int):   
    - BIPUSH : 바이트형 상수(byte-sized constant)를 스택에 로드
    - SIPUSH : 짧은 정수(short-sized constant)를 스택에 로드
    - NEWARRAY :  새로운 배열을 생성

  2. operand(int): opcode에 따라 다르지만, 보통 로드할 정수형 상수의 값을 나타낸다.
mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT); // 정수 배열 생성

 

 

 

2-4. visitInsn: 상수를 Operands 스택에 푸시(ICONST_0, LCONST_1 등)

public void visitInsn(int opcode)
Visits a zero operand instruction.

Parameters:opcode - the opcode of the instruction to be visited. This opcode is either NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE, SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D, L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S, LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN, DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER, or MONITOREXIT.

 

1. opcode(int): 바이트코드 지시문의 종류를 나타내는 opcode

 

visitVarInsn, visitIntInsn 등과 함께 사용되어 바이트코드에서 다양한 연산을 수행한다.

( visitVarInsn은 지역 변수를 조작하는 지시문을 다루고, visitInsn은 기본적인 연산을 수행하는 지시문에 가깝다.)

 

ex : 

        // 지역 변수 인덱스 1번 값을 스택에 로드
        mv.visitVarInsn(Opcodes.ILOAD, 1);
        
        // 상수 값(5)을 스택에 로드.
        mv.visitIntInsn(Opcodes.BIPUSH, 5);
        
        // 스택에 로드된 상위 두 정수를 더한 뒤 저장
        mv.visitInsn(Opcodes.IADD);

 

 

2-5. visitLdcInsn: 상수(constant)를 스택에 로드

public void visitLdcInsn(Object value)

 

String, int, float, long, double과 같은 상수 값을 스택에 푸시한다.

클래스 리터럴이나 메소드 타입, 메소드 핸들도 푸시할 수 있다.

mv.visitLdcInsn(123); // 정수형 상수 123을 스택에 로드

mv.visitLdcInsn("Hello, world!"); // 문자열 상수 "Hello, world!"를 스택에 로드

 

3. 타입 및 인스턴스 생성/조작


3-1. visitMultiANewArrayInsn : 다차원 배열을 생성

public void visitMultiANewArrayInsn(String descriptor, int numDimensions)

다차원 배열의 인스턴스를 생성하고, 이를 피연산자 스택에 푸시하는 작업을 수행한다.

  1. desc(String): 생성할 배열의 유형을 설명하는 문자열(descriptor)
  2. dims(int): 배열의 차원 수
visitMultiANewArrayInsn("[[I", 2); // 2차원 int 배열을 생성하여 스택에 저장

 


3-2. visitTypeInsn : 타입 관련 지시사항(예: NEW, INSTANCEOF)

public void visitTypeInsn(int opcode, String type)

 

타입(type)을 조작하는 바이트코드 지시문. 바이트코드에서 클래스나 배열을 생성하거나 조작할 때 사용한다.

 

  1. opcode(int): 
    - NEW : 새로운 클래스 인스턴스 생성
    - ANEWARRAY : 새로운 배열을 생성
    - CHECKCAST : 객체 유형 확인 후, 해당 유형으로 캐스팅 (불일치시 ClassCastException 발생)
    - INSTANCEOF : 객체의 유형을 검사(결과는 boolean으로 return)
  2. type(String): 지시문이 조작하는 타입을 나타내는 문자열(descriptor), 클래스의 경로를 나타냄.
mv.visitTypeInsn(Opcodes.NEW, "java/util/ArrayList"); // ArrayList 클래스의 새 인스턴스를 생성

mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/String"); // String 배열을 생성

// 클래스 A와 B를 정의.
class A {}
class B extends A {}

// CHECKCAST 
mv.visitTypeInsn(Opcodes.CHECKCAST, "classname/B"); // classname은 클래스 B의 패키지 경로.
// -> 만약 객체가 B 클래스의 인스턴스가 아니라면 ClassCastException이 발생

// INSTANCEOF 
mv.visitTypeInsn(Opcodes.INSTANCEOF, "classname/B");
// -> 스택에 있는 객체가 B 클래스의 인스턴스인지 T/F의 값으로 스택에 푸시

 

3-3. visitLocalVariable : 지역 변수를 생성

public void visitLocalVariable(String name, String descriptor, 
String signature, Label start, Label end, int index)

 

1. name : 지역 변수명

2. descriptor : 유형을 설명하는 문자열(descriptor)

3. start : 변수의 시작 위치

4. end : 변수의 끝 위치

=> 해당 변수가 유효한 범위. 메서드 내의 지역변수라고 한다면, 이 메서드 안에서만 변수가 유효하다. 이 범위값을 잡아주어야 한다. 주로 label을 사용해서 잡는다.

5. index : 변수의 인덱스(해당 메서드 내에서 사용되는 지역 변수의 순서 )

 

    public void visitLocalVariableAnnotation() {
        MethodVisitor mv = cv.visitMethod(ACC_PUBLIC + ACC_STATIC, "visitLocalVariableAnnotation", "()V", null, null);
        mv.visitCode();

        // 로컬 변수의 시작과 끝을 나타내는 레이블 생성
        Label start = new Label();
        Label end = new Label();

        mv.visitLabel(start);
        mv.visitLocalVariable("myLocalVal", "F", null, start, end, 0); //변수 생성
        mv.visitInsn(FCONST_2); //스택에 상수 넣기
        mv.visitVarInsn(FSTORE, 0); //스택 값을 지역 변수에 적용
        mv.visitLabel(end);

        mv.visitMaxs(0, 0);
        mv.visitInsn(RETURN);
    }

 

 

4. 어노테이션 및 메타데이터

4-1. visitTypeAnnotation : 타입 어노테이션을 방문

public AnnotationVisitor visitTypeAnnotation(int typeRef,
 TypePath typePath,
 String descriptor,
 boolean visible)

 

타입 어노테이션은 Java 8부터 도입된, 타입 사용 위치에 적용할 수 있는 어노테이션이다.

이 메서드는 바이트코드에서 클래스, 인터페이스, 제네릭 유형 등의 타입에 적용된 어노테이션을 방문할 때 사용한다.

 

visitTypeAnnotation TypeAnnotationVisitor 인스턴스를 반환할 수 있으며, 이 인스턴스를 사용하여 어노테이션 값에 대해 더 상세하게 방문할 수 있다.

 

  • typeRef: 어노테이션이 적용된 타입에 대한 참조
  • typePath: 어노테이션이 적용된 타입 내의 경로
  • desc: 어노테이션의 설명자(descriptor)
  • visible: 어노테이션의 가시성 여부 ( true인 경우 런타임에 리플렉션을 통해 어노테이션 정보에 접근 가능)
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.TypePath;

MethodVisitor mv = ...; // MethodVisitor 객체 생성

// 타입 어노테이션을 방문
mv.visitTypeAnnotation(
    typeRef, // 어노테이션이 적용된 타입에 대한 참조(reference)
    typePath, // 어노테이션이 적용된 타입 내의 경로(path)
    desc, // 어노테이션의 설명자(descriptor)
    visible // 어노테이션의 가시성 여부
);

// 어노테이션을 처리하기 위한 AnnotationVisitor 생성
AnnotationVisitor av = mv.visitTypeAnnotation(
    typeRef, // 어노테이션이 적용된 타입에 대한 참조(reference)
    typePath, // 어노테이션이 적용된 타입 내의 경로(path)
    desc, // 어노테이션의 설명자(descriptor)
    visible // 어노테이션의 가시성 여부
);

av.visit("value", "newValue"); // 어노테이션의 값을 "newValue"로 변경
av.visitEnd(); // AnnotationVisitor 종료

 

 

4-2. visitAnnotation : 메서드나 클래스에 적용된 어노테이션을 방문

public AnnotationVisitor visitAnnotation(String descriptor, boolean visible)

 

 

1. descriptor : 어노테이션의 설명자(descriptor)

2. visible : 어노테이션의 가시성 여부 ( true인 경우 런타임에 리플렉션을 통해 어노테이션 정보에 접근 가능)

 

메서드, 클래스에 적용된 어노테이션을 방문할 때 호출된다.

 

    public void addAnnotation() {
        MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "haveAnnotation", "(ILjava/lang/String;Ljava/lang/String;)V", null, null);
        mv.visitCode();
        AnnotationVisitor av = mv.visitAnnotation("Ljava/lang/Deprecated;", true); //mv 위에 어노테이션 등록
        av.visitEnd();
        mv.visitMaxs(0, 0);
        mv.visitInsn(RETURN);
    }

 

4-3. visitParameterAnnotation : 특정 파라미터에 적용된 어노테이션을 방문

public AnnotationVisitor visitParameterAnnotation(int parameter,
 String descriptor,
 boolean visible)

 

이 메서드는 바이트코드에서 특정 지시문에 적용된 어노테이션을 방문할 때 호출된다.

 

1. parameter : 어노테이션이 적용될 메서드 파라미터의 인덱스. 파라미터는 0부터 시작하는 인덱스를 사용

2. descriptor : 어노테이션의 설명자(descriptor)

3. visible : 어노테이션의 가시성 여부 ( true인 경우 런타임에 리플렉션을 통해 어노테이션 정보에 접근 가능)

 

    public void visitParameterAnnotation() {
        MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "visitParameterAnnotation", "(ILjava/lang/String;Ljava/lang/String;)V", null, null);
        mv.visitCode();
        // 첫 번째 파라미터(인덱스 0)에 @NotNull 어노테이션 추가, 예를 들어
        AnnotationVisitor av1 = mv.visitParameterAnnotation(0, "Ljavax/validation/constraints/Size;", true);
        av1.visit("min", 1); // @Size 크기 지정
        av1.visit("max", 10);
        AnnotationVisitor av2 = mv.visitParameterAnnotation(1, "Ljavax/validation/constraints/NotNull;", true);
        av1.visitEnd();
        av2.visitEnd();
        mv.visitMaxs(0, 0);
        mv.visitInsn(RETURN);
    }

 

4-4. visitLocalVariableAnnotation : 지역 변수에 적용된 어노테이션을 방문

public AnnotationVisitor visitLocalVariableAnnotation(int typeRef,
 TypePath typePath,
 Label[] start,
 Label[] end,
 int[] index,
 String descriptor,
 boolean visible)

 

로컬 변수 타입에 어노테이션을 적용할 때 사용된다. 메서드 내에서 선언된 로컬 변수의 특정 범위에 어노테이션을 추가하는 기능을 제공한다.

 

  1. typeRef: 어노테이션이 적용될 타입의 참조.
    TypeReference.LOCAL_VARIABLE 또는 TypeReference.RESOURCE_VARIABLE 중 하나여야 한다.
  2. typePath: 어노테이션이 적용될 타입 내의 구체적인 위치. 복잡한 타입 구조 내의 특정 부분에 어노테이션을 적용할 필요가 있을 때 사용. 전체 타입에 어노테이션이 적용될 경우 null로 사용함.
  3. start, end: 로컬 변수가 유효한 범위의 시작과 끝을 나타내는 레이블 배열. start는 범위의 시작을, end는 범위의 끝을 나타낸다.
  4. index: 각 범위에서 로컬 변수의 인덱스를 나타내는 배열. start/end/index의 각 배열의 크기는 일반적으로 같다.
  5. descriptor: 어노테이션 클래스의 디스크립터.
  6. visible: 어노테이션이 런타임에 보일지 여부. true인 경우, 런타임에 리플렉션을 통해 어노테이션 정보에 접근 가능
    public void visitLocalVariableAnnotation() {
        MethodVisitor mv = cv.visitMethod(ACC_PUBLIC + ACC_STATIC, "visitLocalVariableAnnotation", "()V", null, null);
        mv.visitCode();

        // 로컬 변수의 시작과 끝을 나타내는 레이블 생성
        Label start = new Label();
        Label end = new Label();

        //1. 지역 변수 생성
        mv.visitLabel(start); //여기서부터 지역 변수 접근 가능
        mv.visitLocalVariable("myLocalVal", "F", null, start, end, 1); //변수 생성
        mv.visitInsn(FCONST_2); //스택에 상수 넣기
        mv.visitVarInsn(FSTORE, 0); //스택 값을 지역 변수에 적용

        //2. 지역변수에 어노테이션 달기
        AnnotationVisitor av = mv.visitLocalVariableAnnotation(TypeReference.LOCAL_VARIABLE, null, new Label[] {start}, new Label[] {end}, new int[] {1}, "Ljava/lang/Deprecated;", true);
        av.visitEnd();

        mv.visitLabel(end); //이제 지역 변수에 접근할 수 없음
        mv.visitMaxs(0, 0);
        mv.visitInsn(RETURN);
    }

 

 

4-5. visitAnnotationDefault : 어노테이션 인터페이스 메서드의 기본 값을 방문

public AnnotationVisitor visitAnnotationDefault()

 

메서드나 생성자의 기본값을 나타내는 어노테이션을 방문할 때 호출한다.

어노테이션의 기본값은 해당 어노테이션을 사용할 때 명시적으로 값을 지정하지 않은 경우에 사용된다.

 

@interface MyAnnotation {
    String value() default "default value";
}

만일 이렇게 어노테이션을 정의했다 가정하자.
@MyAnnotation의 요소 'value'에는 "default value"가 사용된다.
visitAnnotationDefault 메서드를 사용하면 어노테이션의 기본값을 방문하고 처리할 수 있다.

 

4-6. visitTryCatchAnnotation : try-catch 블록에 적용된 어노테이션을 방문

public AnnotationVisitor visitTryCatchAnnotation(int typeRef, TypePath typePath,
 String descriptor, boolean visible)

 

try-catch 블록에 적용된 어노테이션을 방문할 때 호출된다.

  • typeRef: 어노테이션이 적용된 try-catch 블록에 대한 참조(reference). 예외 핸들러(try-catch 블록)에 어노테이션을 적용하는 데 사용
  • typePath: 어노테이션이 적용된 try-catch 블록 내의 경로(path)를 나타낸다.
  • descriptor: 어노테이션의 설명자(descriptor)를 나타낸다.
  • visible: 어노테이션의 가시성 여부를 나타낸다.

return : AnnotationVisitor 객체를 반환한다. 이것을 사용하여 어노테이션 처리를 진행한다.

 

4-7. visitInsnAnnotation : 특정 바이트코드 명령어에 어노테이션을 추가 

public AnnotationVisitor visitInsnAnnotation(int typeRef, TypePath typePath,
String descriptor, boolean visible)

 

타입 어노테이션을 특정 바이트코드 명령어에 적용할 때 사용한다.

visitInsnAnnotation을 사용하면, 지역 변수의 할당, 타입 캐스트, instanceof 검사, 메서드 호출 등 특정 바이트코드 명령어에 대한 추가적인 메타데이터 정보를 제공할 수 있다.

 

예를 들어, INSTANCEOF, NEW, CAST 등의 명령어에 어노테이션을 추가할 수 있다.

 

  1. typeRef: 어노테이션이 적용될 바이트코드 명령어의 유형을 나타내는 참조. 이 값은 JVM 명세에서 정의된 타입 참조 종류 중 하나를 사용한다.
  2. typePath: 타입 내에서 어노테이션이 적용될 구체적인 위치. 예를 들어, 제네릭 타입의 특정 매개변수에 어노테이션을 적용할 때 사용.
  3. descriptor: 어노테이션의 설명자(descriptor)
  4. visible: 어노테이션의 가시성 여부 ( true인 경우 런타임에 리플렉션을 통해 어노테이션 정보에 접근 가능)

Returns:a visitor to visit the annotation values, or null if this visitor is not interested in visiting this annotatio

 

MethodVisitor mv = ...;

// 타입 캐스트 명령어 바로 전에 어노테이션을 적용
AnnotationVisitor av = mv.visitInsnAnnotation(TypeReference.CAST, null, "Lorg/checkerframework/checker/nullness/qual/NonNull;", true);
av.visitEnd();

// 타입 캐스트 명령어 (예: String 객체를 Integer로 캐스트하려고 시도)
mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");

//=> 타입 캐스트 명령어에 @NonNull 어노테이션을 적용하여, 해당 객체가 널이 아님을 명시적으로 표시

 

 

그 외 (간략한 내용)

5. 제어 흐름

visitLabel : 분기 지점을 나타내는 레이블을 방문

visitJumpInsn: 조건부 점프(label) 명령어. 

이 명령어들은 비교 연산을 수행하기 위해 스택의 값을 사용한다.(예: IFEQ, IFLT 등).

 

visitTableSwitchInsn : 테이블 기반 스위치 지시사항을 방문

visitLookupSwitchInsn : 조회 테이블 기반 스위치 지시사항을 방문
visitTryCatchBlock : 예외 처리 블록을 방문

 

6. 구조 및 디버깅 정보

visitParameter :  메서드 파라미터에 대한 정보(이름, 모드)를 방문
visitAnnotableParameterCount : 어노테이션이 적용 가능한 메서드 파라미터의 수를 방문
visitAttribute : 메서드에 속성을 방문한다. 속성은 바이트코드의 메타데이터를 담는 컨테이너


visitCode() : 메서드의 코드 시작 부분을 방문

이는 메서드의 바이트코드 명령어들을 방문하기 시작함을 나타낸다.


visitFrame : 스택 프레임 정보를 방문

이는 주로 메서드의 상태 변화를 나타내는 데 사용 (스택 프레임 갱신)

 

 

visitLineNumber : 소스 코드의 줄 번호와 바이트코드 지시사항을 연결

 

visitMaxs : 메서드의 최대 스택 크기와 지역 변수의 최대 수를 설정


visitEnd : 메서드 방문의 끝

 

미분류


getDelegate :

특정 구현에서 대리자(delegate) 객체를 가져온다.

ASM API의 일부가 아니며, 사용자 정의 래퍼나 확장 기능일 수 있다.

getDelegate는 ASM의 표준 API에 포함되지 않는, 특정 구현 또는 확장에서 사용될 수 있는 메서드이다.