Extensie | .class |
---|---|
Tip MIME | application/java-vm, application/x-httpd-java |
PUID | x-fmt / 415 |
Semnătură | CA FE BA BE( hexa ) |
Dezvoltat de | Oracol |
Tipul formatului | Executabil |
Standard | Specificații Java |
Specificație | Formatul deschis |
În limbajul de programare Java , codul sursă care se află într-un fișier text printr-o compilație de operații produce un fișier executabil (sau mai multe) a cărui extensie este .class . Un astfel de fișier este încărcat ulterior în memorie de către încărcătorul de clase al oricărei mașini virtuale Java (JVM) pentru a obține definiția clasei în timpul rulării.
Deoarece unul dintre obiectivele Java este de a fi independent de platformă, instrucțiunile din codul sursă sunt convertite într-un cod specific numit bytecode (și nu în limbajul mașinii computerului de compilare) care este stocat într-un fișier de clasă întotdeauna cu extensia . clasa . Pentru a asigura independența Java față de platforma de execuție, formatul de fișier .class este înghețat, astfel încât rezultatul compilării pe o mașină să poată rula pe oricare alta.
Convenția unei JVM este să funcționeze întotdeauna în big-endian . În descrierile care urmează atunci când un număr este codat pe 2 octeți, de exemplu, cel mai semnificativ octet va fi citit mai întâi.
Fișierul conține un număr de tabele, toate au aceeași structură: un contor de 2 octeți urmat de un număr fix sau variabil de octeți pentru fiecare element al tabelului.
Fișierul este împărțit în zece secțiuni (dintre care majoritatea variază în mărime). Iată descrierea lor în ordinea pe care o întâlnesc într-un fișier de clasă.
numele de familie | funcţie | a tăia | Descriere |
---|---|---|---|
număr magic | permite JVM să recunoască un fișier .class | 4 octeți | secvența de valori 0xCA 0xFE 0xBA 0xBE ( CAFEBABE ) |
versiune | permite JVM să verifice dacă este compatibil cu acest fișier .class | De 2 ori 2 octeți | numărul versiunii fișierului, părți minore (întotdeauna 0) apoi majore (vezi notele de mai jos) |
constante | vezi secțiunea următoare | variabil | tabel, fiecare constantă ocupă o dimensiune variabilă |
masca de acces | codificați diferite steaguri referitoare la clasă ( privat , public , abstract ...) | 2 octeți | mască de biți |
numele clasei | numele acestei clase în format intern | 2 octeți | indicatorul din tabelul constantelor către identificatorul intern al acestei clase |
clasa părinte | numele clasei părinte a acestei clase | 2 octeți | indicatorul din tabelul constantelor către identificatorul intern al clasei părinte |
interfețe implementate | enumerați interfețele părinte ale acestei clase | variabil | tabel, 2 octeți pe pointer în tabelul de constante la identificatorul intern al unei clase |
variabile | descrie fiecare variabilă a acestei clase | variabil | tabel, vezi secțiunea de descriere a membrilor clasei |
metode | descrie fiecare metodă a acestei clase | variabil | tabel, vezi secțiunea de descriere a membrilor clasei |
atribute | oferă atribute ale clasei (numele fișierului sursă etc.) | variabil | tabel, fiecare atribut ocupă o dimensiune variabilă |
Note:
Tabelul constantelor stochează majoritatea valorilor constante din clasă (numere sau texte), precum și elemente mai avansate (tipuri de date, nume de clase, nume de atribute etc.) Fiecare constantă este descrisă de un prim octet care își codifică tipul. urmat de un număr fix sau variabil de octeți în funcție de tipul de date.
Contorul tabelului de constante nu este niciodată identic cu numărul de constante, deoarece din motive istorice numerotarea lor începe de la 1 (nu la 0) și, în plus, două tipuri de constante consumă două numere în loc de doar unul.
Sunt definite următoarele tipuri de constante:
tip | funcţie | dimensiune (pe lângă octetul care codifică tipul) | Descriere |
---|---|---|---|
CONSTANT_Integer (3) CONSTANT_Float (4) |
Număr de 32 de biți utilizat în codul Java | 4 octeți | Număr întreg relativ pe 32 de biți sau număr cu virgulă mobilă cu o singură precizie IEEE 754 |
CONSTANT_Long (5) CONSTANT_Double (6) |
Număr de 64 de biți utilizat în codul Java | 8 octeți | Număr întreg relativ relativ pe 64 de biți sau număr cu virgulă mobilă IEEE 754 cu precizie dublă |
CONSTANT_Utf8 (1) | text | variabil | 2 contori octeți urmat de acest număr de octeți reprezentând un text Unicode codificat UTF-8 modificat |
CONSTANT_String (8) | șir de caractere utilizat în codul Java | 2 octeți | pointer în tabelul de constante la un CONSTANT_Utf8 reprezentând un java.lang.String utilizat în codul Java |
CONSTANT_Class (7) | numele unei clase sau a unei interfețe în format intern | 2 octeți | indicatorul din tabelul de constante la un CONSTANT_Utf8 reprezentând numele unei clase |
CONSTANT_NameAndType (12) | identificatorul și tipul unui membru al clasei | De 2 ori 2 octeți | doi indicatori în tabelul constantelor la CONSTANT_Utf8 reprezentând pe de o parte un identificator în codul Java și pe de altă parte un tip de date sau o semnătură de metodă în format intern |
CONSTANT_Fieldref (9) CONSTANT_Methodref (10) CONSTANT_InterfaceMethodref (11) |
referire la un membru al clasei | De 2 ori 2 octeți | doi indicatori în tabelul de constante către o CONSTANT_Class care descrie clasa de bază (sau interfață) a membrului și cealaltă către un CONSTANT_NameAndType care descrie numele și tipul membrului |
Note:
Membrii unei clase sunt descriși de două tabele. Fiecare descriere a membrilor conține următoarele informații.
numele de familie | funcţie | a tăia | Descriere |
---|---|---|---|
masca de acces | codificați diferite stegulețe referitoare la variabilă sau metodă ( privat , public , final ...) | 2 octeți | mască de biți |
nume de utilizator | numele variabilei sau metodei | 2 octeți | indicatorul din tabelul de constante la un CONSTANT_Utf8 care reprezintă identificatorul din codul Java |
tip | tipul de date stocate în variabilă sau semnătura metodei | 2 octeți | pointer în tabelul de constante la un CONSTANT_Utf8 reprezentând un tip de date în format intern |
atribute | oferă atributele membrului | variabil | tabel, fiecare atribut ocupă o dimensiune variabilă |
Tabelul de atribute începe ca toate tabelele, cu numărul de atribute codate pe 2 octeți .
Fiecare atribut este definit de 2 octeți care indică un CONSTANT_Utf8 care furnizează numele acestui atribut urmat de 4 octeți care furnizează numărul de octeți de date ai atributului (în acest fel, dacă un atribut nu este recunoscut de o anumită JVM , ea îl poate ignora cu ușurință ).
În funcție de contextul de utilizare (atribute de clasă, variabilă sau metodă), atributele pot furniza numele fișierului sursă, numărul liniei sursă a unei declarații etc.
Un atribut esențial pentru o variabilă statică finală (o constantă) este ConstantValue, care oferă valoarea sa.
Un atribut esențial pentru o metodă non-abstractă este Codul care conține codul secundar al codului Java compilat.