Какво е Class файл?
Файл с клас в 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 файлов формат на клас и могат да бъдат препоръчани от разработчици за справка. Обобщение на тези полета е както следва.
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[]
- Всяка стойност в таблицата с полета трябва да бъде структура field_info, даваща пълно описание на поле в този клас или интерфейс.methods_count
- Стойността на елемента methods_count дава броя на структурите method_info в таблицата с методи.methods[]
- Всяка стойност в таблицата с методи трябва да бъде структура method_info, даваща пълно описание на метод в този клас или интерфейс. Ако нито един от флаговете ACC_NATIVE и ACC_ABSTRACT не е зададен в елемента access_flags на структура method_info, инструкциите за Java Virtual Machine, прилагащи метода, също се предоставят.attributes_count
- Стойността на елемента attributes_count дава броя на атрибутите (§4.7) в таблицата с атрибути на този клас.attributes[]
- Всяка стойност на таблицата с атрибути трябва да бъде структура attribute_info.