프로젝트/APM prototype 개발

[A Java bytecode engineering library] - [Tree API] 9.Metadata

블랑v 2024. 2. 23. 22:20

 

이번 파트는 상대적으로 짧은 편이다.

 

9. 메타데이터(Metadata)

 

이 장에서는 컴파일된 자바 클래스의 메타데이터(예: 애너테이션)에 대한 트리 API를 소개한다. 이 메타데이터는 이미 4장에서 소개되었고, 해당 코어 API를 알고 나면 트리 API가 간단하기 때문에 이 장은 매우 짧다.

 

9.1. 제네릭(Generics)

 

트리 API는 제네릭 타입에 대한 지원을 제공하지 않는다! 실제로 제네릭 타입을 코어 API에서와 같이 시그니처로 표현하지만, SignatureVisitor에 해당하는 SignatureNode 클래스를 제공하지 않으며, 비록 가능하지만(실제로는 타입, 메소드, 클래스 시그니처를 구분하기 위해 여러 Node 클래스를 사용하는 것이 편리할 것이다).

 

9.2. 애너테이션(Annotations)

 

애너테이션에 대한 트리 API는 AnnotationNode 클래스를 기반으로 하며, 그 공개 API는 다음과 같다:

 

 

desc 필드는 애너테이션 타입을 포함하며, values 필드는 이름 값 쌍을 포함한다. 여기서 각 이름은 연관된 값이 뒤따른다(값의 표현은 Javadoc에서 설명된다).

알 수 있듯이 AnnotationNode 클래스는 AnnotationVisitor 클래스를 확장하며, 클래스와 메소드 방문자 클래스와 마찬가지로, 이 타입의 객체를 매개변수로 받는 accept 메소드도 제공한다. 따라서 클래스와 메소드에 대해 본 패턴도 애너테이션에 대한 코어 및 트리 API 컴포넌트를 구성하는 데 사용할 수 있다.

예를 들어, 상속을 기반으로 한 패턴의 "익명 내부 클래스" 변형(7.2.2 섹션 참조)을 애너테이션에 적용하면 다음과 같다:

 

 

9.3. 디버그(Debug)

 

클래스가 컴파일된 소스 파일은 ClassNode의 sourceFile 필드에 저장된다.

소스 라인 번호에 대한 정보는 AbstractInsnNode에서 상속받은 LineNumberNode 객체에 저장된다. 코어 API에서 명령어와 동시에 라인 번호 정보를 방문하는 것과 마찬가지로, LineNumberNode 객체는 명령어 리스트의 일부이다. 마지막으로 소스 로컬 변수의 이름과 타입은 MethodNode의 localVariables 필드에 저장되며, 이는 LocalVariableNode 객체의 리스트이다.

 

Reference

 

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

 

ASM USER GUIDE

 

Copyright c 2007, 2011 Eric Bruneton All rights reserved. Redistribution and use in source (LYX format) and compiled forms (LATEX, PDF, PostScript, HTML, RTF, etc), with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code (LYX format) must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in compiled form (converted to LATEX, PDF, PostScript, HTML, RTF, and other formats) must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this documentation without specific prior written permission.

 

THIS DOCUMENTATION IS PROVIDED BY THE AUTHOR “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.