Что такое файл класса?
Файл класса в Java — это скомпилированный результат класса .java, который фактически выполняется виртуальной машиной Java (JVM). Файлы классов могут выполняться по отдельности, а также могут быть частью файла JAR в виде пакета вместе с другими файлами пакетов. Их можно создать с помощью команды javac
из интерфейса командной строки. Некоторые Java IDE, такие как Eclipse и NetBeans, обеспечивают создание выходных файлов .class из Java проекта. файлы.
Формат файла класса
Файл класса Java состоит из байт-кода, который является промежуточным кодом для запуска JVM. Файл класса состоит из потока 8-битных байтов, а многобайтовые элементы данных всегда хранятся в обратном порядке.
Структура файла класса
Структура файла класса показана ниже.
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];
}
куда:
- u1 = однобайтовое количество без знака
- u2 = беззнаковое двухбайтовое количество
- u4 = беззнаковое четырехбайтовое количество
Подробная информация о структуре файла .class также объясняется в Oracle формат файла класса, на которую можно ссылаться разработчиков для справки. Ниже приводится сводка этих полей.
magic
- магический элемент предоставляет магическое число, идентифицирующее формат файла класса; он имеет значение 0xCAFEBABE.minor_version
,major_version
- Значения элементов minor_version и major_version представляют собой младшую и основную версии этого файла класса.constant_pool_count
— значение элемента Constant_pool_count равно количеству записей в таблице Constant_pool плюс один. Индекс пула констант считается допустимым, если он больше нуля и меньше числа констант_пула, за исключением констант типа long и double.constant_pool[]
— Constant_pool представляет собой таблицу структур (§4.4), представляющих различные строковые константы, имена классов и интерфейсов, имена полей и другие константы, на которые ссылаются в структуре ClassFile и ее подструктурах. Формат каждой записи таблицы Constant_pool указывается ее первым байтом «tag».access_flags
- значением элемента access_flags является маска флагов, используемая для обозначения прав доступа и свойств этого класса или интерфейса.this_class
- значение элемента this_class должно быть действительным индексом в таблице Constant_pool.super_class
- Для класса значение элемента super_class либо должно быть равно нулю, либо должно быть действительным индексом в таблице Constant_pool.interfaces_count
— значение элемента interfaces_count дает количество прямых суперинтерфейсов этого класса или типа интерфейса.interfaces[]
- Каждое значение в массиве interfaces должно быть действительным индексом в таблице Constant_pool.fields_count
— значение элемента fields_count дает количество структур field_info в таблице полей.fields[]
- Каждое значение в таблице fields должно быть структурой field_info, дающей полное описание поля в этом классе или интерфейсе.methods_count
— значение элемента method_count дает количество структур method_info в таблице методов.methods[]
- Каждое значение в таблице методов должно быть структурой method_info, дающей полное описание метода в этом классе или интерфейсе. Если ни один из флагов ACC_NATIVE и ACC_ABSTRACT не установлен в элементе access_flags структуры method_info, также предоставляются инструкции виртуальной машины Java, реализующие метод.attributes_count
— значение элемента attribute_count дает количество атрибутов (§4.7) в таблице атрибутов этого класса.attributes[]
- Каждое значение таблицы атрибутов должно быть структурой attribute_info.