본문 바로가기

프로그래밍 언어/자바

[Java] ClassFile 포맷

자바 클래스 파일 포맷

class 파일은 다음과 같은 구조를 갖는다.

  • u1, u2, u4 는 각각 1B, 2B, 4B 를 의미함.
ClassFile {
 u4 magic;
 u2 minor_version;
 u2 major_version;
 u2 constant_pool_count;
 cp_info constant_pool[constant_pool_count-1];
 u2 access_flags;
 u2 this_class;
 u2 super_class;
 u2 interfaces_count;
 u2 interfaces[interfaces_count];
 u2 fields_count;
 field_info fields[fields_count];
 u2 methods_count;
 method_info methods[methods_count];
 u2 attributes_count;
 attribute_info attributes[attributes_count];
}
  • magic : class 파일의 포맷을 구분하기 위한 값. 0xCAFEBABE 를 가짐.
  • minor_version, major_version : class 파일의 버전을 의미. 파일 버전을 지칭할 때는 M.m. 으로 표현한다. M은 메이저, m은 마이너. 다시말해 Mi.0 ≤ v ≤ Mj.m 범위의 파일 포맷임을 의미. JDK의 release 버전에 따라서 지원하는 클래스파일 포맷 버전이 존재하므로 이를 확인하기 위한 것으로 보인다.
  • constant_pool_count : constant_poo 테이블의 길이.
  • constant_pool[] : constant_pool 테이블 배열. constant_pool 테이블의 각 엔트리의 포멧은 첫번째 ‘tag’ byte 를 통해 명시됨.
  • access_flags : class 파일을 통해 구현될 class와 interface의 접근 권한을 명시함. 마스킹 타입으로 표현됨. 0x0000
  • this_class : constant_pool에 담긴 CONSTANT_Class_info 구조체 엔트리의 인덱스. 해당 구조체는 클래스 또는 인터페이스를 표현한다.
  • super_class : constant_pool에 담긴, 상위 클래스 또는 상위 인터페이스의 CONSTANT_Class_info 구조체 엔트리의 인덱스. 만약 0이라면 해당 class 파일은 Object를 나타낸다. 그게 아니라면 반드시 0이 아닌 값이 담겨야 한다.
  • interfaces_count : implement한 인터페이스 개수.
  • interfaces[] : 인터페이스의 정보를 담은 구조체(CONSTANT_Class_info)가 constant_pool에서 어떤 인덱스에 담겨있는지 나타냄. 소스에 표시된 순서대로(왼쪽 → 오른쪽) 배열에 인덱스가 담겨짐.
  • fields_count : fields[] 테이블의 길이.
  • fields[] : 여기서 의미하는 field는 클래스 멤버 변수, 인스턴스 변수를 의미. field_info 구조체가 담김.
  • methods_count : methods[] 테이블의 길이.
  • method[] : method_info 구조체를 담은 배열. super class에서 상속받은 메소드는 담겨있지 않음.
  • attributes_count : attributes[] 테이블의 길이
  • attributes[] : attribute_info 구조체를 담은 배열. attribute는 무엇인가? Classfile, filed_info, method_info, Code_attribute 에 대한 특성값을 지정하기 위한 것이다. 내용이 방대하여 전부 알 필요는 없을 듯 하다.