byte code 로 컴파일 된 클래스의 대략적인 구조는 다음과 같다.
- public 또는 private 같은 modifiers, 이름, 부모 클래스, 인터페이스, 어노테이션 들로 구성된 하나의 섹션
- 선언된 필드 당 하나의 섹션
- 필드의 modifiers, 이름, type, 어노테이션 들로 구성
- 생성자 와 메소드 당 하나의 섹션
- 메소드의 modifiers, 이름, 반환 및 파라미터 타입, 어노테이션 들로 구성
- 자바 바이트 코드 인스트럭션들이 나열된 형태로 이루어진 컴파일 된 코드 포함
소스 코드와 컴파일 된 코드의 차이점
- 컴파일 된 클래스는 오직 하나의 클래스만으로 구성된다. 반면, 소스코드는 하나 이상의 inner 클래스를 포함 수 있다.
- 예를 들어, 하나의 inner 클래스를 가지는 소스 코드의 경우
- 메인 클래스가 컴파일 된 클래스 파일 ,inner 클래스가 컴파일 된 클래스 파일로 분리되어 컴파일 된 파일이 생성된다.
- 두 컴파일 된 클래스 파일들은 서로 참조 할 수 있게 reference 를 포함한다.
- 컴파일 된 클래스는 주석을 포함하지 않는다. 하지만 클래스, 필드의 부가적인 정보를 나타내는 속성은 포함할 수 있다.
- Java 5 부터 소개된 어노테이션의 사용으로 인해 속성은 거의 필요가 없어졌다.
- 컴파일 된 클래스는 패키지나 import 섹션이 없다. 따라서, 타입 이름은 축약되지 않은 형태이다.
- ClassTransformer -> java/lang/intstrument/ClassTransformer
- 컴파일 된 클래스는 constant pool이라는 중요한 섹션을 가진다.
- 클래스 내의 모든 numeric, string, type 상수를 포함하는 배열
참고 : http://download.forge.objectweb.org/asm/asm4-guide.pdf
Figure 2.1.: Overall structure of a compiled class (* means zero or more)
Modifiers, name, super class, interfaces |
|
Constant pool: numeric, string and type constants | |
Source file name (optional) | |
Enclosing class reference | |
Annotation* | |
Attribute* | |
Field* | Modifiers, name, type |
Annotation* | |
Attribute* | |
Method* | Modifiers, name, return and parameter types |
Annotation* | |
Attribute* | |
Compiled code |
'프로그래밍 > BCI' 카테고리의 다른 글
[Java] ASM을 이용한 클래스 생성 (0) | 2015.03.19 |
---|---|
[Java] ASM을 이용한 .class 파일 파싱 (0) | 2015.03.19 |
[Java] javap 프로그램을 이용하여 .class파일 출력 (0) | 2015.03.18 |
[Java]컴파일된 클래스 내부에서의 타입 및 메소드 표현 (0) | 2015.03.18 |
ASM 개요 (0) | 2015.03.18 |