본문 바로가기

프로그래밍/BCI

[Java]컴파일된 클래스 구조

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