본문 바로가기

기술스택/ASM - [Bytecode]

(18)
[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] - [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 이 장에서는 컴파일된 자바 클래스의 멤버 제거, 인터페이스 및 컴포넌트 ..
[A Java bytecode engineering library] 1. Introduction 1.1. Motivations 프로그램 분석, 생성 및 변환은 다양한 상황에서 유용하게 사용될 수 있는 기술이다. • 프로그램 분석은 간단한 구문 분석부터 전체 의미 분석에 이르기까지 다양하며, 응용 프로그램에서 잠재적인 버그를 찾거나 사용되지 않는 코드를 탐지하고, 코드를 역공학하는 데 사용될 수 있다. • 프로그램 생성은 컴파일러에서 사용되며, 이는 전통적인 컴파일러뿐만 아니라 분산 프로그래밍을 위한 스텁 또는 스켈레톤 컴파일러, 실시간 컴파일러 등을 포함한다. • 프로그램 변환은 프로그램을 최적화하거나 난독화하고, 응용 프로그램에 디버깅 또는 성능 모니터링 코드를 삽입하며, 관점 지향 프로그래밍 등에 사용될 수 있다. 이러한 기술들은 모든 프로그래밍 언어에 사용될 수 있지만, 언어에 따라 수행하기가..
[ASM][TreeAPI]Tree API에서 주로 사용하는 클래스 및 메서드 개요 Tree API에서 주로 사용하는 클래스 및 메서드에는 여러 가지가 있다. 기본적으로 ClassNode, MethodNode, InsnList가 중요한 역할을 하지만, 이 외에도 여러 유용한 클래스와 인터페이스가 있다. 여기에는 다음과 같은 것들이 포함된다. ClassNode : 클래스 노드. 트리 노드의 최상단 부모라고 생각하자. MethodNode : 클래스의 메서드를 나타낸다. 메서드의 접근 지정자, 이름, 설명 등을 포함할 수 있다. FieldNode: 클래스의 필드를 나타낸다. 필드의 접근 지정자, 이름, 설명, 초기값 등을 포함할 수 있다. AnnotationNode: 어노테이션을 나타낸다. 어노테이션의 설명자와 값들을 포함한다. VarInsnNode: 메서드의 지역 변수를 나타낸다. 변..