Файл класса Java

редактировать
Файл класса Java
РазработаноSun Microsystems

A Файл класса Java - это файл (с расширением имени файла.class ), содержащий байт-код Java, который может быть выполнен на виртуальной машине Java (JVM). Файл класса Java обычно создается компилятором Java из исходных файлов языка программирования Java (файлов.java), содержащих классы Java (альтернативно, другие языки JVM также могут использоваться для создания файлов классов). Если исходный файл имеет более одного класса, каждый класс компилируется в отдельный файл класса.

JVM доступны для многих платформ, и файл класса, скомпилированный на одной платформе, будет выполняться на JVM другой платформы. Это делает приложения Java независимыми от платформы.

Содержание

  • 1 История
  • 2 Макет и структура файла
    • 2.1 Разделы
    • 2.2 Magic Number
    • 2.3 Общий макет
    • 2.4 Представление в C-подобный язык программирования
    • 2.5 Постоянный пул
  • 3 См. также
  • 4 Ссылки
  • 5 Дополнительная литература

История

11 декабря 2006 г. формат файла класса был изменено в соответствии с Запросом спецификации Java (JSR) 202.

Макет и структура файла

Разделы

В структуре файла класса Java 10 основных разделов :

  • Magic Number : 0xCAFEBABE
  • Версия формата файла класса : дополнительная и основная версии файла класса
  • Пул констант : Пул констант для класса
  • Флаги доступа : например, является ли класс абстрактным, статическим и т. Д.
  • Этот класс : имя текущего класса
  • Суперкласс : имя суперкласса
  • Интерфейсы : Любые интерфейсы в классе
  • Поля : Любые поля в класс
  • Методы : любые методы в классе
  • Атрибуты : любые атрибуты класса (например, имя исходного файла и т. д.)

Magic Number

Файлы классов идентифицируются следующими 4 байтами заголовкомшестнадцатеричном формате ): CA FE BA BE(первый 4 записи в таблице ниже). История этого магического числа была объяснена Джеймсом Гослингом со ссылкой на ресторан в Пало-Альто :

«Мы обычно ходили обедать в место под названием St Michael's Alley. Согласно местной легенде, в глубоком темном прошлом Grateful Dead выступали там, прежде чем они добились успеха. Это было довольно модное место, определенно являющееся Grateful Dead Kinda Place. Когда Джерри умер, они даже построили маленькую святыню в буддийском стиле. Когда мы ходили туда, мы называли это место Cafe Dead. Где-то по ходу дела было замечено, что это был шестнадцатеричный номер. -vamping некоторый код формата файла и потребовалась пара магических чисел : одно для постоянного объектного файла и одно для классов. Я использовал CAFEDEAD для формата объектного файла, а в grepping для четырехзначных шестнадцатеричных слов, подходящих после "КАФЕ" (это показалось хорошей темой), я нажал на BABE и решил использовать его. В то время это не казалось таким уж важным или предназначенным никуда, кроме мусорный бак истории. Таким образом, CAFEBABE стал форматом файлов классов, а CAFEDEAD - форматом постоянных объектов. Но функция постоянных объектов исчезла, а вместе с ней и CAFEDEAD - в конечном итоге он был заменен на RMI.

Общий макет

Поскольку файл класса содержит элементы переменного размера и не также содержат встроенные смещения файлов (или указатели), обычно они анализируются последовательно, от первого байта до конца. На самом низком уровне формат файла описывается в терминах нескольких основных типов данных:

  • u1: беззнаковое 8-битное целое
  • u2: беззнаковое 16-битное целое in big-endian byte order
  • u4: беззнаковое 32-битное целое число с прямым порядком байтов
  • table : массив элементов переменной длины какой-то тип. Количество элементов в таблице идентифицируется предыдущим числом счетчика (счетчик - u2), но размер в байтах таблицы можно определить только путем изучения каждого из ее элементов.

Некоторые из этих основных типов являются затем повторно интерпретируются как значения более высокого уровня (например, строки или числа с плавающей запятой), в зависимости от контекста. Выравнивание слов не осуществляется принудительно, поэтому байты заполнения никогда не используются. Общий вид файла класса показан в следующей таблице.

смещение байтаразмертип или значениеописание
04 байтаu1 =. 0xCA шестнадцатеричныймагический число (CAFEBABE), используемое для идентификации файла как соответствующего формату файла класса
1u1 =. 0xFE hex
2u1 =. 0xBA hex
3u1 =. 0xBE hex
42 байтаu2дополнительный номер версии используемого формата файла класса
5
62 байтаu2основной номер версии класса используемый формат файла..

Java SE 15 = 59 (0x3B шестнадцатеричный),. Java SE 14 = 58 (0x3A шестнадцатеричный),. Java SE 13 = 57 (0x39 шестнадцатеричный),. Java SE 12 = 56 (0x38 шестнадцатеричный),. Java SE 11 = 55 (0x37 шестнадцатеричный),. Java SE 10 = 54 (0x36 шестнадцатеричный),. Java SE 9 = 53 (0x35 шестнадцатеричный),. Java SE 8 = 52 (0x34 шестнадцатеричный),. Java SE 7 = 51 (0x33 шестнадцатеричный),. Java SE 6.0 = 50 (0x32 шестнадцатеричный),. Java SE 5.0 = 49 (0x31 шестнадцатеричный),. JDK 1.4 = 48 (0x30 шестнадцатеричный),. JDK 1.3 = 47 (0x2F шестнадцатеричный),. JDK 1.2 = 46 (0x2E шестнадцатеричный),. JDK 1.1 = 45 (0x2D шестнадцатеричный).. Подробнее о номерах более ранних версий см. Сноску 1 на Спецификация виртуальной машины JavaTM. fication 2nd edition

7
82 байтаu2счетчик постоянного пула, количество записей в следующей таблице постоянного пула. Это количество как минимум на единицу больше фактического количества записей; см. следующее обсуждение.
9
10cpsize (variable)tableтаблица пула констант, массив записей пула констант переменного размера, содержащий такие элементы, как буквальные числа, строки, и ссылки на классы или методы. Индексируется, начиная с 1, и содержит (постоянное количество пулов - 1) общее количество записей (см. Примечание).
...
...
...
10 + cpsize2 байтаu2флаги доступа, битовая маска
11 + cpsize
12 + cpsize2 байтаu2идентифицирует этот класс, индексирует в пуле констант для записи типа "Class"
13 + cpsize
14 + cpsize2 байтаu2идентифицирует суперкласс, индекс в пуле констант для записи типа "Class"
15 + cpsize
16 + cpsize2 байтаu2количество интерфейсов, количество записей в следующей таблице интерфейсов
17 + cpsize
18 + cpsizeisize (variable)tableinterface table: массив переменной длины постоянных индексов пула, описывающих интерфейсы, реализованные этим классом
...
...
...
18 + cpsize + isize2 байтаu2количество полей, количество записи в следующей таблице полей
19 + cpsize + isize
20 + cpsize + isizefsize (переменная)таблицатаблица полей, переменная длина массив полей

каждый эл. Элемент - это структура field_info, определенная в https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.5

...
...
...
20 + cpsize + isize + fsize2 байтаu2количество методов, количество записей в следующей таблице методов
21 + cpsize + isize + fsize
22 + cpsize + isize + fsizemsize (переменная)tableтаблица методов, массив методов переменной длины

каждый элемент представляет собой структуру method_info, определенную в https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.6

...
...
...
22 + cpsize + isize + fsize + msize2 байтаu2количество атрибутов, количество записей в следующей таблице атрибутов
23 + cpsize + isize + fsize + msize
24 + cpsize + isize + fsize + msizeasize (переменная)таблицатаблица атрибутов, массив атрибутов переменной длины

каждый элемент представляет собой структуру attribute_info, определенную в https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.ht ml # jvms-4.7

...
...
...

Представление на C-подобном языке программирования

Поскольку C не делает ' t поддерживают несколько массивов переменной длины в структуре, приведенный ниже код не компилируется и служит только для демонстрации.

struct Class_File_Format {u4 magic_number; 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_count]; u2 fields_count; field_info fields [fields_count]; u2 method_count; method_info методы [method_count]; u2 attributes_count; attribute_info атрибуты [attribute_count]; }

Пул констант

Таблица пула констант - это место, где хранится большая часть буквальных значений констант. Сюда входят такие значения, как числа всех видов, строки, имена идентификаторов, ссылки на классы и методы и дескрипторы типов. Все индексы или ссылки на определенные константы в таблице пула констант задаются 16-битными числами (тип u2), где значение индекса 1 относится к первой константе в таблице (значение индекса 0 недопустимо).

Из-за исторического выбора, сделанного во время разработки формата файла, количество констант в таблице пула констант фактически не совпадает с количеством констант пула, которое предшествует таблице. Сначала таблица индексируется, начиная с 1 (а не с 0), но на самом деле счет должен интерпретироваться как максимальный индекс плюс один. Кроме того, два типа констант (длинные и двойные) занимают два последовательных слота в таблице, хотя второй такой слот является фантомным индексом, который никогда напрямую не используется.

Тип каждого элемента (константы) в пуле констант идентифицируется начальным байтовым тегом. Количество байтов, следующих за этим тегом, и их интерпретация зависят от значения тега. Допустимые типы констант и их значения тегов:

Байт тегаДополнительные байтыОписание константыПредставленная версия
12 + x байтов. (переменная)Строка UTF-8 (Unicode): строка символов с префиксом 16-битного числа (тип u2), указывающая количество байтов в закодированной строке, которая следует непосредственно за ней (которая может отличаться от количество знаков). Обратите внимание, что используемая кодировка на самом деле не UTF-8, но включает небольшую модификацию стандартной формы кодировки Unicode.1.0.2
34 байтаЦелое число: 32-битное дополнение до двух со знаком в формате big-endian1.0.2
44 байтаFloat: 32-битное число с одинарной точностью IEEE 754 число с плавающей запятой1.0.2
58 байтовLong: 64-битное число со знаком в дополнительном коде в формате big-endian (занимает два слота в постоянной таблице пула)1.0.2
68 байтовDouble: a 64-битное число с плавающей запятой IEEE 754 двойной точности (занимает два слота в таблице пула констант)1.0.2
72 байтаСсылка на класс: индекс внутри константы в строку UTF-8, содержащую полное имя класса (во внутреннем формате) (с прямым порядком байтов)1.0.2
82 байтаСсылка на строку: индекс внутри пул констант в строку UTF-8 (также с прямым порядком байтов)1.0.2
94 байтаСсылка на поле: два индекса в пуле констант, первый указывает на класс ссылка, вторая - на дескриптор имени и типа. (big-endian)1.0.2
104 байтаСсылка на метод: два индекса в пуле констант, первый указывает на ссылку на класс, второй - к дескриптору Name и Type. (big-endian)1.0.2
114 байтаСсылка на метод интерфейса: два индекса в пуле констант, первый указывает на ссылку на класс, второй - к дескриптору Name и Type. (big-endian)1.0.2
124 байтаДескриптор имени и типа: два индекса для строк UTF-8 в пуле констант, первый представляет имя (идентификатор), а второй - дескриптор специально закодированного типа.1.0.2
153 байтаДескриптор метода: эта структура используется для представления описателя метода и состоит из одного байта дескриптора типа, за которым следует индекс в пуле констант.7
162 байтаТип метода: эта структура используется для представления типа метода и состоит из индекса в пуле констант.7
174 байтаДинамический: используется для указания динамически вычисляемой константы, полученной при вызове метода начальной загрузки.11
184 байтаInvokeDynamic: используется инструкцией invokedynamic для указания метода начальной загрузки, имени динамического вызова, типа аргумента и возвращаемого значения вызова и, необязательно, последовательности дополнительных констант, называемых статическими аргументами. в метод начальной загрузки.7
192 байтаМодуль: используется для идентификации модуля.9
202 байтаПакет: используется для идентификации пакета, экспортированного или открытого модулем.9

Есть только два o целочисленные постоянные типы, целые и длинные. Другие целочисленные типы, встречающиеся в языке высокого уровня, такие как boolean, byte и short, должны быть представлены как целочисленные константы.

Имена классов в Java, если они полностью определены, традиционно разделяются точками, например «java.lang.Object». Однако внутри низкоуровневых ссылочных констант класса появляется внутренняя форма, в которой вместо этого используется косая черта, например «java / lang / Object».

Строки Unicode, несмотря на прозвище «строка UTF-8», на самом деле не кодируются в соответствии со стандартом Unicode, хотя это похоже. Есть два отличия (полное обсуждение см. В UTF-8 ). Во-первых, кодовая точка U + 0000 кодируется как двухбайтовая последовательность C0 80(в шестнадцатеричном формате) вместо стандартной однобайтовой кодировки 00. Второе отличие состоит в том, что дополнительные символы (те, которые находятся за пределами BMP в U + 10000 и выше) кодируются с использованием конструкции суррогатной пары, аналогичной UTF-16, а не напрямую с использованием UTF-8. В этом случае каждый из двух суррогатов кодируется отдельно в UTF-8. Например, U + 1D11E кодируется как 6-байтовая последовательность ED A0 B4 ED B4 9E, а не как правильная 4-байтовая кодировка UTF-8 F0 9D 84 9E.

См. также

  • значок Портал компьютерного программирования

Ссылки

Дополнительная литература

Последняя правка сделана 2021-05-24 03:57:43
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте