>  기사  >  Java  >  Java의 클래스 파일 형식에 대한 자세한 그래픽 및 텍스트 설명

Java의 클래스 파일 형식에 대한 자세한 그래픽 및 텍스트 설명

黄舟
黄舟원래의
2017-06-18 09:45:321806검색

JVM을 이해하고 Java 언어를 깊이 이해하려면 클래스 파일의 형식을 배우고 이해하는 것이 필수 숙제입니다.

Java 아키텍처에서 클래스 파일의 위치와 역할

JVM을 이해하고 Java 언어에 대한 심층적인 이해, 클래스 파일의 형식 학습 및 이해는 모두 마스터해야 하는 교훈입니다. 그 이유는 매우 간단합니다. JVM은 우리가 작성하는 Java 소스 파일을 이해하지 못합니다. JVM에서 클래스 파일을 인식하려면 먼저 Java 소스 파일을 클래스 파일로 컴파일해야 합니다. 이 인터페이스를 이해하면 JVM의 동작을 더 잘 이해할 수 있습니다. 반면에 클래스 파일은 소스 파일에서 표현하려는 의미를 다른 방식으로 다시 설명합니다. Java 언어와 문법에 대한 심층적인 이해를 위해 작성했는데 매우 도움이 되었습니다. 또한 어떤 언어이든지 클래스 파일로 컴파일할 수 있다면 JVM에서 인식하고 실행할 수 있다. 따라서 클래스 파일은 크로스 플랫폼의 기반일 뿐만 아니라 JVM 크로스 언어의 기초. 클래스 파일 형식을 이해하는 것은 JVM을 기반으로 학습하는 데 매우 중요합니다.

간단히 말하면 전체 Java 기술 아키텍처에서 클래스 파일은 중간에 위치하며 전체 시스템을 이해하는 연결 역할을 합니다. 그림과 같이

Class 파일 형식 개요

class 파일은 8비트 바이너리 스트림 파일로, 각 데이터 항목은 앞에서 뒤로 순서대로 촘촘하게 배열되어 있으며, 인접해 있지 않습니다. 클래스 파일을 매우 작고 가볍게 만드는 항목 간의 간격은 JVM에 의해 메모리에 빠르게 로드될 수 있으며 메모리 공간을 덜 차지합니다. Java 소스 파일이 컴파일된 후 각 클래스(또는 인터페이스)는 별도의 클래스 파일을 차지하며 클래스의 모든 정보는 클래스 파일에 해당 설명을 갖게 됩니다. 클래스 파일은 매우 유연하기 때문에 Java 소스보다 훨씬 더 유연합니다. 파일에는 더 강력한 설명 기능이 있습니다.

클래스 파일의 정보는 하나씩 고정된 길이를 가지며 일부는 1바이트, 일부는 2바이트, 일부는 4바이트 또는 8바이트를 차지합니다. 데이터 항목의 길이는 다음과 같습니다. u1, u2, u4, u8로 각각 표현되는데, 이는 각각 데이터 항목이 클래스 파일에서 1바이트, 2바이트, 4바이트, 8바이트를 점유함을 나타냅니다. u1, u2, u3 및 u4를 클래스 파일 데이터 항목의 "유형"으로 생각할 수 있습니다.

클래스 파일에는 다음 데이터 항목이 있습니다(이 차트는 "심층 Java Virtual Machine"에서 참조됨).

수량u4

magic

1

u2

minor_version

1

u2

major_version

1

u2

constant_pool_count

1

cp_info

constant_pool

constant_pool_count - 1

u2

access_flags

1

u2

ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

u2

interfaces_count

1

u2

인터페이스

interfaces_count

u2

fields_count

1

field_info

필드

fields_count

u2

methods_count

1

method_info

methods

method_count

u2

attribute_count

1

속성_정보

attributes

attributes_count


다음은 클래스 파일의 각 항목에 대한 자세한 설명입니다.

클래스 파일의 매직 넘버와 버전 번호

(1) Magic

클래스 파일 시작 부분의 4바이트는 클래스 파일의 매직 넘버를 저장합니다. 클래스 파일의 경우 고정 값: 0XCAFEBABE입니다. 즉, 파일이 클래스 형식인지 판단하는 기준이다. 처음 4바이트가 0XCAFEBABE가 아니면 클래스 파일이 아니어서 JVM에서 인식할 수 없다는 뜻이다.

(2) major_version

매직 넘버 바로 뒤의 4바이트는 클래스 파일의 버전 번호와 메이저 버전 번호입니다. Java가 발전함에 따라 클래스 파일의 형식도 그에 따라 변경됩니다. 버전 번호는 클래스 파일이 추가되거나 변경된 시기를 나타냅니다. 예를 들어, javac 컴파일러의 버전에 따라 컴파일된 클래스 파일의 버전 번호가 다를 수 있으며, JVM의 버전에 따라 인식되는 클래스 파일의 버전 번호도 다를 수 있습니다. 일반적으로 JVM의 상위 버전에서는 해당 클래스 파일을 인식할 수 있습니다. 하위 버전의 javac 컴파일러로 컴파일된 클래스 파일이지만, 하위 버전의 JVM은 상위 버전의 javac 컴파일러로 컴파일된 클래스 파일을 인식할 수 없습니다. 더 낮은 버전의 JVM을 사용하여 더 높은 버전의 클래스 파일을 실행하는 경우 JVM은 java.lang.UnsupportedClassVersionError를 발생시킵니다. 구체적인 버전 번호 변경은 여기에서 논의되지 않으며, 필요한 독자는 스스로 정보를 참조할 수 있습니다.

클래스 파일 내 상수 풀 개요

클래스 파일에서는 버전 번호 뒤에 상수 풀과 관련된 데이터 항목이 위치합니다. 상수 풀은 클래스 파일에서 매우 중요한 데이터입니다. 상수 풀에는 텍스트

string, 상수 값, 현재 클래스의 클래스 이름, 필드 이름, 메서드 이름, 각 필드 및 메서드의 설명자, 현재 클래스의 필드 및 메서드에 대한 참조 정보, 현재 클래스의 기타 참조가 저장됩니다. . 수업 참고 정보 등 상수 풀에는 클래스의 거의 모든 정보에 대한 설명이 포함되어 있습니다. 클래스 파일의 다른 많은 부분은 나중에 설명할 this_class, super_class, field_info, attribute_info 등과 같은 상수 풀의 데이터 항목에 대한 참조입니다. bytes 코드 명령어에는 상수 풀에 대한 참조도 있습니다. 이 상수 풀에 대한 참조는 바이트코드 명령어의 피연산자로 사용됩니다. 또한 상수 풀의 각 항목은 서로를 참조합니다.

클래스 파일의 Constant_pool_count 값은 1입니다. 이는 각 클래스에 하나의 상수 풀만 있음을 나타냅니다. 상수 풀에 있는 데이터도 공백 없이 하나씩 배출됩니다. 상수 풀의 각 데이터 항목은

index를 통해 액세스됩니다. 이는 상수 풀의 첫 번째 항목 인덱스가 0이 아닌 1이라는 점을 제외하면 배열과 다소 유사합니다. 인덱스 0이 다른 곳에서 참조되는 경우 class 파일 상수 풀 항목은 상수 풀 항목을 참조하지 않는다는 의미입니다. 클래스 파일의 각 데이터 항목에는 고유한 유형이 있습니다. 마찬가지로 상수 풀의 각 데이터 항목에도 고유한 유형이 있습니다. 상수 풀의 데이터 항목 유형은 다음과 같습니다.

1 CONSTANT_Float4 긴 형식 리터럴 이중 유형 리터럴클래스 또는 인터페이스에 대한 기호 참조문자열 유형 리터럴 값필드에 대한 기호 참조선언된 메서드에 대한 기호 참조 클래스인터페이스에 선언된 메서드에 대한 기호 참조다음에 대한 부분적 상징적 참조 필드 또는 방법

상수 풀의 데이터 항목 유형

type 플래그

type 설명

CONSTANT_Utf8

float 유형 리터럴

CONSTANT_Long

5

CONSTANT_Double

6

CONSTANT_Class

7

CONSTANT_String

8

CONSTANT_Fieldref

9

CONSTANT_Methodref

10

CONSTANT_InterfaceMethodref

11

CONSTANT_NameAndType

12

각 데이터 항목을 XXX_info 항목이라고 합니다. 예를 들어 상수 풀에 있는 CONSTANT_Utf8 유형의 항목은 CONSTANT_Utf8_info입니다. 또한 각 정보 항목에는 플래그 값(태그)이 있으며, 이 플래그 값은 위의 에서 볼 수 있듯이 CONSTANT_Utf8_info 태그 값이 1이고, CONSTANT_Fieldref_info의 태그 값은 9입니다.

Java 프로그램은 동적 연결 구현에서 상수 풀이 중추적인 역할을 합니다. 일부 리터럴을 저장하는 것 외에도 상수 풀은 다음과 같은 기호 참조도 저장합니다.

(1) 클래스 및 인터페이스의 정규화된 이름

(2) 필드 이름 및 설명자

(3 ) 메서드 이름 및 설명자

상수 풀의 각 데이터 항목을 자세히 설명하기 전에 먼저 클래스 파일의 특수 문자 문자열을 이해해야 합니다. 상수 풀에는 특수 문자열이 많이 나타나기 때문입니다. 위에 언급된 정규화된 이름과 설명입니다. 상수 풀의 각 데이터 항목을 이해하려면 먼저 이러한 특수 문자열을 이해해야 합니다.

위 내용은 Java의 클래스 파일 형식에 대한 자세한 그래픽 및 텍스트 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.