Java 클래스의 bytecode instrument 프레임워크인 ASM Guide 문서를 읽고 간단히 정리해 보자
* 참조 파일
> Object Based Model
- ASM 라이브러리는 컴파일된 클래스의 generating 과 transforming API를 제공한다.
- DOM(예)의 경우 : event 기반 모델로 클래스를 이벤트 시퀀스로 표현한다. (Event Based Model)
- ASM의 경우 : object 기반 모델로 클래스를 오브젝트 트리로 표현한다. (Object Based Model)
> 구성
- asm.jar : class parster 와 writer (core API)
- asm-util.jar : 개발, 디버깅시에 사용 (core 의존)
- asm-commons.jar : 미리 정의한 class 변환기 (core 의존)
- asm-tree.jar : object 표현을 event 표현으로 변환
- asm-analysis.jar : 미리 정의한 분석기와 분석 프레임워크 (tree 의존)
> Core API
- class methods, annotations, generics에 대한 generate 과 transform을 Core API 활용하여 어떻게 하는지 알아본다
- 컴파일된 클래스 구조(Structure) : 간단히 3가지로 나뉨
+ modifier 영역 : public, private
+ field 영역 : modifier, type이나 annotation of a field, name 선언
+ method, constructor 영역 : modifier, name, return, parameter type, annotation of a method
- 컴파일 클래스와 소스의 차이
+ 소스는 여러 클래스를 포함한다 : inner class
+ 컴파일 클래스는 하나 클래스로 표현하고 comment 제거하고 package, import도 포함하지 않는다.
+ 컴파일 클래스는 "constant pool"가 있다. constant pool은 배열(Array)이다. 한번만 생성이 도고 index로 참조되어 진다.
>>> 컴파일 클래스의 전체 구조
+ 컴파일 클래스는 타입표현 명명이 틀리다. internal name 은 클래스의 전체 이름을 사용한다.
java/lang/String같이 slash(/)로 구분한다.
+ Internal name은 type에도 적용된다. (type descriptor)
>>> type descriptor 맵핑
+ method descriptor는 type descriptor의 목록이다.
>>> 메소드 예
- ClassVisitor 추상 클래스가 컴파일된 클래스의 생성/변환을 담당한다. AnnotationVisitor, FieldVisitor, MethodVisitor 리턴
- FieldVisitor 추상 클래스
- Core API는 ClassVisitor API에 기반하여 클래스 generate 와 transform 할 수 있게 3가지 core 컴포넌트를 제공한다
+ ClassReader : byte array 주어진 컴파일된 클래스를 파싱한다. ClassVisitor를 accept 메소드 파라미터로 주면
visitXxx 메소드를 호출한다 (event producer)
+ ClassWriter : ClassVisitor의 subclass이고 컴파일된 클래스를 바이너리로 만든다. toByteArray메소드롤 얻을 수 있는
byte array로 결과물을 생산한다 (event consumer)
+ ClassVisitor : 다른 ClassVisitor를 받으면 메소드 호출을 위임한다 (event filter)