aspose.info
UK

Клас - формат файлу класу Java

Оновлено

Що таке файл класу?

Файл класу в Java — це скомпільований вихід класу .java, який фактично виконується віртуальною машиною Java (JVM). Файли класів можуть виконуватися окремо, а також можуть бути частиною файлу JAR як пакет разом з іншими файлами пакетів. Їх можна створити за допомогою команди javac з інтерфейсу командного рядка. Деякі Java IDE, як-от Eclipse і NetBeans, забезпечують створення вихідних файлів .class із Java проекту файли.

Формат файлу класу

Файл класу Java містить байт-код, який є проміжним кодом для запуску JVM. Файл класу складається з потоку 8-бітних байтів і багатобайтових елементів даних завжди зберігаються в порядку старшого.

Структура 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];
}

де:

  • u1 = однобайтова кількість без знаку
  • u2 = двобайтова кількість без знаку
  • u4 = чотирибайтова кількість без знаку

Детальну інформацію про структуру файлу .class також описано в [форматі файлу класу] Oracle (https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html), і можна отримати посилання розробників для довідки. Короткий опис цих полів наведено нижче.

  • magic - чарівний елемент надає магічне число, що ідентифікує формат файлу класу; він має значення 0xCAFEBABE.
  • minor_version, major_version – значення елементів minor_version і major_version є номерами другорядної та основної версій цього файлу класу.
  • constant_pool_count - значення елемента constant_pool_count дорівнює кількості записів у таблиці constant_pool плюс один. Індекс constant_pool вважається дійсним, якщо він більший за нуль і менший за constant_pool_count, за винятком констант типу 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[] – кожне значення в масиві інтерфейсів має бути дійсним індексом у таблиці constant_pool.
  • fields_count – значення поля fields_count визначає кількість структур field_info у таблиці fields.
  • fields[] – кожне значення в таблиці fields має бути структурою field_info, яка дає повний опис поля в цьому класі або інтерфейсі.
  • methods_count - значення елемента methods_count визначає кількість структур method_info у таблиці методів.
  • methods[] – кожне значення в таблиці методів має бути структурою method_info, яка дає повний опис методу в цьому класі або інтерфейсі. Якщо жоден із прапорів ACC_NATIVE та ACC_ABSTRACT не встановлено в елементі access_flags структури method_info, інструкції віртуальної машини Java, що реалізують метод, також надаються.
  • attributes_count - значення атрибутів_count елемента визначає кількість атрибутів (§4.7) у таблиці атрибутів цього класу.
  • attributes[] – кожне значення таблиці атрибутів має бути структурою attribute_info.

Список літератури

Див. також