ASM

ASM User Guide 번역 1

yimoc 2018. 9. 10. 16:24


https://asm.ow2.io/asm4-guide.pdf



ASM 4.0 

A Java bytecode engineering library




1.2. Overview

1.2.1. Scope

ASM 라이브러리의 목표는 컴파일 자바클래스 파일을 생성, 변환 및 분석하는 것입니다.Java 클래스는 바이트 배열로 표현됩니다 (디스크에 저장되고 Java 가상 머신에 로드 됨). 이를 위해 ASM은 숫자 상수, 문자열, Java 식별자, Java 유형, Java 클래스 구조 요소 등과 같이 바이트보다 상위 개념을 사용하여 바이트 배열을 읽고 쓰고 변환하는 도구를 제공합니다. ASM의 범위는 클래스의 읽기, 쓰기, 변형 및 분석에만 엄격하게 제한됩니다. 특히 클래스 로딩 프로세스는 범위를 벗어납니다.


1.2.2. Model

ASM 라이브러리는 컴파일된 클래스의 생성과 변환을위한 두 개의 API를 제공합니다.

코어 API는 클래스의 이벤트 기반 표현을 제공하지만 트리 API는 객체 기반 표현을 제공합니다.


이벤트 기반 모델에서 클래스는 일련의 이벤트로 표현되며, 각 이벤트는 클래스의 요소 (예 : 헤더, 필드,메소드 선언, 명령어 등)를 표현한다.


이벤트 기반 API는 가능한 이벤트 세트 및 발생 순서를 정의하며

분석되는 요소 당 하나의 이벤트를 발생하는 클래스 구문 분석기와 

이러한 이벤트의 시퀀스에서 컴파일 된 클래스를 생성하는 클래스 작성기를 제공합니다.


객체 기반 모델을 사용하면 클래스는 객체 트리로 표현됩니다.

각 객체는 클래스 자체, 필드, 메소드 등의 클래스의 일부를 나타내는 객체.지시 등를 나타냅니다.


각 객체는 해당 구성을 나타내는 객체에 대한 참조를가집니다.

객체 기반 API는 클래스를 나타내는 일련의 이벤트를 그클래스를 나타내는 객체 트리로 변환하거나 ,

반대로 객체 트리를 동등한 이벤트 시퀀스로 변환하는 방법을 제공합니다.

즉, 객체 기반 API는 이벤트 기반 API 위에 구축됩니다.


이 두 API는 SAX (Simple API for XML) 및 DOM (Document Object Model) API와 비교할수 있습니다 : 이벤트 기반

API는 SAX와 유사하지만 객체 기반 API는 DOM과 유사합니다. 객체 기반 API는 DOM이 SAX기반에 제공되듯이 이벤트 기반 객체 위에 구축됩니다.


ASM은 최상의 API가 없기 때문에 두 API를 모두 제공합니다. 실제로 각 API에는 장점과 단점이 있습니다.


• 이벤트 기반 API가 빠르고 객체기반API보다 적은 메모리가 필요합니다.

왜냐하면 , 클래스를 표현하기 위해 메모리에 트리를 생성하고 저장할 필요가 없기 때문이다.(SAX 및 DOM도 동일한 차이가 있다).


• 그러나, 이벤트 기반 API를 사용하여 클래스 변환을 구현하는 것이 더 어려울 수 있습니다.

객체 기반 API를 사용하여 전체 클래스를 메모리에서 사용하여 하는것보다, 어느 한 주어진 시점(현재 이벤트에 해당하는 요소)에 클래스의 한 요소만 사용하기 때문이다.

  > SAX처럼 한 이벤트가 발생하는 시점에 이루어지기 때문에 전체를 보고 작업하는것보다는 어렵다는 얘기



두 API는 한 번에 하나의 클래스 만 관리하고 독립적으로 관리합니다.

클래스 계층 구조에 대한 정보는 유지되지 않으며 클래스 변환이 다른 클래스에 영향을주는 경우 다른 클래스를 수정하는 것은 사용자의 책임입니다.



1.2.3. Architecture


ASM 애플리케이션은 강력한 아키텍처 측면을 가지고 있습니다. 사실 이벤트 기반 API는 이벤트 생성자 (클래스 파서), 이벤트 소비자 (클래스 작성자) 및 미리 정의 된 다양한 이벤트 필터를 구성됩니다.  또한, 사용자 정의한 생성자, 소비자 및 필터도 추가할수 있습니다. 따라서, 이 API를 사용하는 것은 두 단계 프로세스입니다.


• 이벤트 생성자, 필터 및 소비자 구성 요소를 가능한 복잡한 구조로 모으고,


• 생성 또는 변환 프로세스를 실행하기 위해 이벤트 생성자를 시작합니다.


오브젝트 기반 API는 또한 아키텍처 측면을 가지고 있습니다. 실제로 객체트리에서 작동하는 클래스 생성기 또는 변환기 구성 요소가 구성 될 수 있으며, 이들 사이의 링크는 변환 순서를 나타냅니다.


전형적인 ASM 애플리케이션의 대부분의 컴포넌트 아키텍처는 매우 간단하지만 다음과 같은 복잡한 아키텍처를 상상할 수 있습니다. 

화살표는 클래스 파서, 생성자 또는 변환기 사이의 이벤트 기반 또는 오브젝트 기반 통신을 나타냅니다.

체인 내의 이벤트 기반 표현과 객체 기반 표현 간의 가능한 변환이다.

  


CR은 ClassReader, CW는 ClassWriter이다. 중간의 박스는 Adaptor 및 기타 CR, CW 사용가능하다.


1.3. Organization


ASM 라이브러리는 여러 패키지로 구성되며 각패키지는 jar 파일로 배포됩니다.


• org.objectweb.asm 및 org.objectweb.asm.signature 패키지

이벤트 기반 API를 정의하고 클래스 parser와 writer 구성 요소를 제공합니다.

이 파일은 asm.jar 아카이브에 들어 있습니다.


• org.objectweb.asm.util 패키지는 asm-util.jar 에 있습니다.

ASM 애플리케이션의 개발 및 디버깅에 사용되는 다양한 도구를 제공합니다.

해당 tool은 core API를 기반으로 합니다.


• org.objectweb.asm.commons 패키지는 core API를 기반으로 하는 몇 가지 유용한 미리 정의 된 클래스 변환기를 제공합니다. 

asm-commons.jar 아카이브에 포함되어 있습니다.


• org.objectweb.asm.tree 패키지는 asm-tree.jar 아카이브에 있습니다.

객체 기반 API를 정의하고 이벤트 기반 및 객체 기반 표현간의 변환을 위한 툴을 제공합니다.


• org.objectweb.asm.tree.analysis 패키지는 클래스 분석 프레임워크을 제공합니다.

또한, 몇 가지 미리 정의 된 클래스 분석기를 제공합니다. 해당 기능은 트리API기반입니다.

asm-analysis.jar 아카이브에 포함되어 있습니다.


이 문서는 두 부분으로 구성되어 있습니다. 첫 번째 부분은 핵심 API, 즉 asm, asm-util 및 asm-commons 아카이브를 다룹니다. 두 번째 부분은 트리 API, 즉 asm-tree 및 asm-analysis 아카이브를 다룹니다. 각 Part에는 클래스와 관련된 API 장, 메소드와 관련된 API에 대한 장 및 annotation, generic Type 등과 관련된 API에 대한 장이 포함됩니다. 각 장에는 프로그래밍 인터페이스와 관련 도구가 포함되어 있습니다 사전 정의 된 구성 요소. 모든 예제의 소스 코드는 ASM 웹 사이트에서 제공됩니다.


이 구조을 통해 클래스 파일 기능을 점진적으로 도입하는 것이 더 쉬워 지지만 때로는 여러 섹션에서 단일 ASM 클래스의 프레젠테이션을 분산해야하는 경우가 있습니다. 따라서이 문서를 순차적으로 읽는 것이 좋습니다. ASM API에 대한 참조 가이드는 Javadoc을 사용하십시오.


javadoc : https://javadoc.io/doc/org.ow2.asm/asm/6.2.1



2018/09/10 - [ASM] - ASM User Guide 번역 2