본문 바로가기

treeAPI

(7)
[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를 사용하면, 바이트코드 구조를 이해하기 쉬운 객체 모델을 통해 작업할 수 있다. 이는 복잡한 조작을 단순화시키고 코드의 가독성을 높여준다.쉬운 수정: 클래스 파일의 구조를 트리로 표현하기 때문에, ..
[ASM][TreeAPI]Tree API에서 주로 사용하는 클래스 및 메서드 개요 Tree API에서 주로 사용하는 클래스 및 메서드에는 여러 가지가 있다. 기본적으로 ClassNode, MethodNode, InsnList가 중요한 역할을 하지만, 이 외에도 여러 유용한 클래스와 인터페이스가 있다. 여기에는 다음과 같은 것들이 포함된다. ClassNode : 클래스 노드. 트리 노드의 최상단 부모라고 생각하자. MethodNode : 클래스의 메서드를 나타낸다. 메서드의 접근 지정자, 이름, 설명 등을 포함할 수 있다. FieldNode: 클래스의 필드를 나타낸다. 필드의 접근 지정자, 이름, 설명, 초기값 등을 포함할 수 있다. AnnotationNode: 어노테이션을 나타낸다. 어노테이션의 설명자와 값들을 포함한다. VarInsnNode: 메서드의 지역 변수를 나타낸다. 변..
[ASM][Util]TraceClassVisitor/고수준 코드 출력하기[InteliJ] Java ASM 라이브러리의 TraceClassVisitor는 Java 바이트코드를 분석하고 조작하기 위한 도구 중 하나이다. ASM 라이브러리는 Java 클래스 파일을 직접 읽고 쓰며, 이를 통해 런타임에 클래스의 구조를 변경하거나 분석할 수 있는 기능을 제공한다. TraceClassVisitor는 ASM의 방문자(visitor) API 중 하나로, 클래스 파일의 내용을 분석하고 이해하기 쉬운 형태로 출력하는 데 사용된다. 1. 개념 TraceClassVisitor는 ASM 라이브러리에서 제공하는 클래스 방문자 중 하나로, 방문한 바이트코드 구조(클래스, 메소드, 필드 등)를 사람이 읽을 수 있는 형식으로 출력하는 기능을 한다. 이 클래스는 ClassVisitor 인터페이스를 구현하며, 방문자 패턴을 ..
[A Java bytecode engineering library] - [Tree API] 9.Metadata 이번 파트는 상대적으로 짧은 편이다. 9. 메타데이터(Metadata) 이 장에서는 컴파일된 자바 클래스의 메타데이터(예: 애너테이션)에 대한 트리 API를 소개한다. 이 메타데이터는 이미 4장에서 소개되었고, 해당 코어 API를 알고 나면 트리 API가 간단하기 때문에 이 장은 매우 짧다. 9.1. 제네릭(Generics) 트리 API는 제네릭 타입에 대한 지원을 제공하지 않는다! 실제로 제네릭 타입을 코어 API에서와 같이 시그니처로 표현하지만, SignatureVisitor에 해당하는 SignatureNode 클래스를 제공하지 않으며, 비록 가능하지만(실제로는 타입, 메소드, 클래스 시그니처를 구분하기 위해 여러 Node 클래스를 사용하는 것이 편리할 것이다). 9.2. 애너테이션(Annotatio..
[ASM] Label 기본 개념 및 if/for/while 제어문 바이트코드 조작 개요 Label의 기본 개념 Label 객체는 코드 내 특정 위치를 가리키는 마커 역할을 한다. 이 위치는 다른 지점에서 점프하거나 분기할 때 참조될 수 있다. ASM에서는 메서드의 바이트 코드를 생성하거나 수정할 때, Label을 사용하여 조건문, 반복문, try-catch 블록 등의 흐름 제어 구조를 구현한다. Label은 MethodVisitor 인터페이스를 통해 메서드의 코드를 방문할 때 사용되며, visitLabel(Label label) 메소드를 사용하여 코드 상의 특정 위치를 정의한다. Label 사용 방법 Label 객체 생성: 먼저, Label 객체를 생성한다. 이 객체는 코드 내의 특정 위치를 나타낸다. Label start = new Label(); Label 위치 정의: 메서드 바이..
[A Java bytecode engineering library] - [Tree API] 8. Method Analysis 8. Method Analysis 이 장에서는 메소드의 코드를 분석하는 ASM API를 소개한다. 이 API는 트리 API를 기반으로 한다. 코드 분석 알고리즘 소개로 시작하여, 해당 ASM API와 일부 예시를 제시한다. 8.1. 소개 코드 분석은 매우 광범위한 주제이며, 코드를 분석하기 위한 많은 알고리즘이 존재한다. 여기서 모두를 소개하는 것은 불가능하며 이 문서의 범위를 벗어난다. 사실 이 섹션의 목적은 단지 ASM에서 사용되는 알고리즘에 대한 개요를 제공하는 것이다. 이 주제에 대한 더 나은 소개는 컴파일러에 관한 책에서 찾을 수 있다. 다음 섹션에서는 데이터 흐름과 제어 흐름 분석이라는 두 가지 중요한 코드 분석 기술을 소개한다: 데이터 흐름 분석( data flow analysis )은 메소..