4. Формат class-файла
Скомпилированный код, исполняемый виртуальной машиной Java, представлен в виде
двоичного формата, не зависящего от операционной системы и аппаратного обеспечения.
Обычно (но не обязательно) он хранится в файле, известном как файл формата
class. Формат файла class строго определяет представление класса или
интерфейса, включая такие детали, как порядок байт, который может отличаться на
разных платформах. Каждый файл class содержит определение единственного файла
или интерфейса.
Файл class состоит из последовательности 8-битовых байт. Все 16, 32 и
64-битные величины конструируются в виде 2, 4 и 8 байт. Многобайтовые элементы
хранятся в порядке big-endian, когда старшие байты находятся по младшему
адресу. В платформе Java 2 этот формат поддерживается интерфейсами
java.io.DataInput, java.io.DataOutput и классами
java.io.DataInputStream и java.io.DataOutputStream.
Формат файла class описывается с использованием псевдоструктурной нотации,
написанной в стиле структурной нотации языка C. Во избежание замешательства с полями
классов, экземплярами классов и т.п. терминами, содержимое структур, описывающих
файл формата class, называется элементами (items). Следующие друг за
другом элементы хранятся в файле class последовательно, без заполнения или
выравнивания.
Листинг 1. Структура ClassFile.
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];
}
Файл class состоит из единственной структуры ClassFile.
Элементы этой структуры имеют следующее значение:
magic - элемент представляет собой "магическое" число, идентифицирующее
файл, как файл формата class. Он имеет значение 0xCAFEBABE.
minor_version и major_version - эти элементы являются младшей и
старшей цифрой номера версии этого файла class. Если major_version=M и
minor_version=m, то версию файла класс можно обозначить M.m. Реализация
виртуальной машины Java может поддерживать только версии файлов class в
определенном диапазоне. Только Sun может определять, какой диапазон версий
файла class соответствует определенной версии Java машины.
constant_pool_count - значение элемента равно количеству элементов в
таблице набора констант (constant_pool[]) + 1. Индекс элемента из набора
констант считается верным, если он больше 0 и меньше constant_pool_count, за
исключением констант типа long и double.
constant_pool[] - это таблица структур cp_info, представляющих
различные строковые константы, имена классов и интерфейсов, названия полей и другие
константы, которые связаны со структурой ClassFile и ее подструктурами.
Формат каждой записи в таблице указан в ее первом байте.
access_flags - значение элемента это маска флагов, используемых для
обозначения прав доступа к свойствам этого класса или интерфейса.
Таблица 3. Флаги прав доступа.
| Название флага |
Значение |
Описание |
| ACC_PUBLIC |
0x0001 |
Объявлен как public; доступен извне своего пакета. |
| ACC_FINAL |
0x0010 |
Объявлен как final; не допускает производных классов. |
| ACC_SUPER |
0x0020 |
|
| ACC_INTERFACE |
0x0200 |
Это интерфейс. |
| ACC_ABSTRACT |
0x0400 |
Объявлен как abstract. |
this_class - значение элемента - это действительный элемент в наборе
констант (constant_pool[]). Запись в наборе констант по этому индексу должна
быть типа CONSTANT_Class_info. Эта структура представляет класс или
интерфейс, описанный в этом файле class.
super_class - значение этого элемента должно быть или нулем или
действительным элементом в наборе констант (constant_pool[]). Если этот
элемент равен нулю, то это означает, что класс не имеет суперкласса (является
производным только от класса Object). А если не равен нулю, то запись в
наборе констант по этому индексу должна быть типа CONSTANT_Class_info.
interfaces_count - значение этого элемента равно количеству интерфейсов,
которые реализует этот класс.
interfaces[] - каждое значение в массиве interfaces должно быть
действительным индексом в наборе констант. Каждая запись по индексу
interfaces[i] (0 <= i < interfaces_count) в наборе констант должна
быть типа CONSTANT_Class_info.
fields_count - значение элемента равно количеству структур
field_info в таблице fields. Структуры field_info представляют
все поля, определенные этим классом.
fields[] - каждое значение в таблице fields[] должно быть
структурой field_info, дающей полное описание поля в этом классе или
интерфейсе. Таблица fields[] содержит только те поля, которые явно объявлены
в этом классе. Она не включает те элементы, которые представляют поля,
наследованные от суперкласса или суперинтерфейса.
methods_count - значение элемента равно количеству структур
method_info в таблице methods[].
methods[] - каждое значение в таблице methods[] должно быть
структурой method_info, дающей полное описание метода в этом классе или
интерфейсе. Таблица methods[] не содержит те методы, которые наследованы от
суперкласса или суперинтерфейса.
attributes_count - значение этого элемента равно количеству атрибутов в
таблице attributes[] этого класса.
attributes[] - таблица, каждое значение в которой является "атрибутной"
структурой. В основном - это дополнительная информация. В спецификации рекомендуется
игнорировать все атрибуты в этой таблице.
Дескриптор - это строка, представляющая тип поля или метода. Дескрипторы
представлены в файле class в виде строк, закодированных с помощью кодировки
UTF-8.
Наверх
|