본문 바로가기

전체 글

(227)
[A Java bytecode engineering library] - [Tree API] 7. Method 개인 학습 정리MethodNodepublic class MethodNode extends MethodVisitor { public int access; // 메서드의 접근 제어자. 예: ACC_PUBLIC, ACC_PRIVATE 등 public String name; // 메서드 이름 public String desc; // 메서드 서술자(descriptor). 매개변수와 반환 타입 포함 public String signature; // 메서드 시그니처. 제네릭 정보 포함 public List exceptions; // 메서드가 던질 수 있는 예외 타입 목록 public List parameters; // 메서드 매개변수 목록 public List visibleAnnotations; // 런타임에서 보이..
[A Java bytecode engineering library] - [Tree API] 6. Classes 개인 학습 정리Tree API?ASM의 Tree API는 바이트코드 조작을 위한 보다 높은 수준의 추상화를 제공한다. Core API가 방문자 패턴(visitor pattern)에 의존하여 바이트코드를 직접 조작하는 방식이라면, Tree API는 바이트코드를 더 쉽게 조작할 수 있도록 메모리 내 트리 구조로 클래스를 표현한다. 이를 통해 사용자는 바이트코드 구성 요소(예: 메서드, 필드, 애너테이션)를 노드로서 조작할 수 있게 된다. Tree API의 주요 특징은 다음과 같다.고수준의 추상화: Tree API를 사용하면, 바이트코드 구조를 이해하기 쉬운 객체 모델을 통해 작업할 수 있다. 이는 복잡한 조작을 단순화시키고 코드의 가독성을 높여준다.쉬운 수정: 클래스 파일의 구조를 트리로 표현하기 때문에, ..
[A Java bytecode engineering library] - [Core API] 5. Backward compatibility(역호환 해당 파트는 직접적인 개발은 아니지만, Legacy version의 호환 가능성과 규칙에 대해 정의한다.5. Backward compatibility5.1. 서론 과거에 클래스 파일 포맷에 새로운 요소가 도입되었고, 미래에도 새로운 요소들이 추가될 것이다(예: 모듈성, 자바 타입에 대한 애너테이션 등). ASM 3.x까지, 이러한 변화는 ASM API에 역호환성이 없는 변경을 초래했는데, 이는 바람직하지 않다. 이러한 문제를 해결하기 위해 ASM 4.0에서 새로운 메커니즘이 도입되었다. 그 목적은 클래스 파일 포맷에 새로운 기능이 도입되더라도, 모든 미래의 ASM 버전이 ASM 4.0 이후의 모든 이전 버전과 역호환성을 유지하도록 하는 것이다. 이는 클래스 생성기, 클래스 분석기 또는 클래스 어댑터가 A..
[A Java bytecode engineering library] - [Core API] 4. Metadata 개인 내용 정리시그니처와 SignatureVisitor 시그니처 : 클래스, 인터페이스, 필드, 메소드 등을 JVM이나 컴파일러가 인식할 수 있도록 정의한 기술적인 정보. SignatureVisitor는 ASM 라이브러리에서 제공하는 인터페이스로, 바이트코드의 시그니처를 방문하여 읽거나 수정할 때 사용된다. 이 인터페이스를 사용하면 제네릭 타입, 클래스 시그니처, 메소드 시그니처 등을 분석하고 조작할 수 있다. 여러 메서드를 통해 세부적인 시그니처 요소들을 방문하고 수정할 수 있으며, 이는 타입 파라미터, 반환 타입, 예외 타입 등 다양한 요소들을 처리할 수 있게 해준다. 타입 시그니처(Type Signature)예를 들어, List 클래스에서 E라고 할 수 있을 것이다. 특정 input의 Type을 지..
[A Java bytecode engineering library]chap02 실습파일 Logic package com.sch.testapm.test.controller; import com.sch.testapm.reference.chap2.ClassPrinter; import lombok.extern.slf4j.Slf4j; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; imp..
[A Java bytecode engineering library] - [Core API] 3. Method[1/3] https://d2.naver.com/helloworld/1230 개인 요약 노트 이전 장에서 ClassVisitor의 구현체가 내부에서 'visitCode', 'visitMethod' 등 기능을 Override했었다. 추가적인 내용은 없었지만 사실 이 내부에서 바이트코드 명령어가 자동적으로 수행되고 있었을 것이다. 바이트코드 변환 과정은 JVM의 스택 메모리 구조를 활용하여 클래스와 메서드를 실행하는 방식을 반영한다. 메서드의 실행 과정은 지역 변수 배열에서 필요한 정보를 로드하여 피연산자 스택에서 연산을 수행하고, 그 결과를 다시 지역 변수 배열에 저장하거나 반환하는 과정이다. 순서와 스택 프레임, 연산 JVM은 스택 기반의 가상 머신으로 각 스레드는 자신만의 실행 스택을 가지고 있으며, 이 스택은 ..
[A Java bytecode engineering library] - [Core API] 2. Classes[2/2] 2. 클래스[2/2] 2.2.4. 클래스 변환( Transforming classes) 지금까지 ClassReader 및 ClassWriter 구성 요소는 독립적으로 사용되었다. 이벤트는 "수동으로" 생성되어 ClassWriter에 직접 소비되거나, 대칭적으로 ClassReader에 의해 생성되어 "수동으로", 즉 사용자 정의 ClassVisitor 구현에 의해 소비되었다. 이러한 구성 요소가 함께 사용될 때 진정한 흥미가 시작된다. 첫 번째 단계는 ClassReader에서 생성된 이벤트를 ClassWriter로 직접 전달하는 것이다. 결과는 클래스 리더에 의해 파싱된 클래스가 클래스 작성자에 의해 재구성된다는 것이다: 이 자체로는 그다지 흥미롭지 않다(바이트 배열을 복사하는 더 쉬운 방법이 있다!), ..
[A Java bytecode engineering library] - [Core API] 2. Classes[1/2] 실습 파일 및 내용 요약 https://csg1353.tistory.com/167 [ASM Library Guildline]chap02 실습파일 Logic package com.sch.testapm.test.controller; import com.sch.testapm.reference.chap2.ClassPrinter; import lombok.extern.slf4j.Slf4j; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.springframework.web.bind.annotation csg1353.tistory.com 이 장에서는 컴파일된 자바 클래스의 멤버 제거, 인터페이스 및 컴포넌트 ..