Životni stil datoteke klase Java

Dobrodošli u još jedan dio "Under the Hood". U prošlomjesečnom članku raspravljao sam o Java Virtual Machine (JVM), apstraktnom računalu za koje su sastavljeni svi Java programi. Ako vam JVM nije poznat, možda ćete htjeti pročitati prošlomjesečni članak prije ovog. U ovom članku pružam uvid u osnovnu strukturu i način života datoteke Java klase.

Rođena za putovanje

Datoteka klase Java precizno je definiran format za kompajliranu Javu. Java izvorni kod kompiliran je u datoteke klase koje bilo koji JVM može učitati i izvršiti. Datoteke razreda mogu putovati mrežom prije nego što ih JVM učita.

Zapravo, ako ovaj članak čitate putem preglednika koji podržava Java, datoteke klase za simulacijski aplet na kraju članka upravo sada prelaze preko Interneta na vaše računalo. Ako ih želite slušati (a vaše računalo ima audio mogućnost), pritisnite sljedeći gumb:

Za pregled ovog apleta potreban vam je preglednik s omogućenom Java

Zvuči kao da se zabavljaju, ha? To je u njihovoj prirodi. Datoteke Java klase dizajnirane su za dobro putovanje. Neovisni su o platformi, pa će biti dobrodošli na više mjesta. Sadrže bajtkodove, kompaktni set uputa za JVM, tako da mogu putovati lagano. Datoteke Java klase neprestano se prebacuju kroz mreže vrtoglavom brzinom kako bi stigle u JVM-ove po cijelom svijetu.

Što se nalazi u datoteci predavanja?

Datoteka Java klase sadrži sve što JVM treba znati o jednoj Java klasi ili sučelju. Prema redoslijedu pojavljivanja u datoteci klase, glavne su komponente: magija, verzija, konstantno spremište, zastavice pristupa, ova klasa, super klasa, sučelja, polja, metode i atributi.

Informacije pohranjene u datoteci razreda često se razlikuju u duljini - to jest, stvarna duljina informacija ne može se predvidjeti prije učitavanja datoteke klase. Na primjer, broj metoda navedenih u komponenti metoda može se razlikovati među datotekama klasa, jer ovisi o broju metoda definiranih u izvornom kodu. Takve se informacije organiziraju u datoteci razreda tako što se stvarne informacije predodrže prema njihovoj veličini ili duljini. Na taj se način, kada JVM učitava klasu, prvo čita veličina podataka promjenjive duljine. Jednom kada JVM zna veličinu, može ispravno pročitati stvarne informacije.

Informacije se obično zapisuju u datoteku razreda bez razmaka ili dodavanja između uzastopnih podataka; sve je poravnato na granicama bajtova. To pomaže da datoteke klasa budu sitne, tako da će biti aerodinamične dok lete po mrežama.

Redoslijed komponenata datoteke klase strogo je definiran tako da JVM-ovi mogu znati što mogu očekivati ​​i gdje to očekivati ​​prilikom učitavanja datoteke klase. Na primjer, svaki JVM zna da prvih osam bajtova datoteke klase sadrži čarobne brojeve i brojeve verzija, da konstantno spremište započinje u devetom bajtu i da pristupne zastavice slijede konstantno spremište. Ali budući da je konstantni bazen promjenjive duljine, on ne zna točno gdje se nalaze zastave za pristup dok ne završi čitanje u konstantnom spremištu. Kad završi s čitanjem u konstantnom spremištu, zna da će sljedeća dva bajta biti pristupne zastavice.

Magija i brojevi verzija

Prva četiri bajta svake datoteke klase uvijek su 0xCAFEBABE. Ovaj čarobni broj olakšava prepoznavanje datoteka Java klase jer su male šanse da datoteke neklase započnu s ista početna četiri bajta. Broj se naziva čarobnim jer ga dizajneri formata datoteka mogu izvući iz šešira. Jedini je uvjet da ga već ne koristi drugi format datoteke koji se može susresti u stvarnom svijetu. Prema Patricku Naughtonu, ključnom članu izvornog Java tima, magični broj je odabran "puno prije nego što je naziv Java ikad izgovoren u odnosu na ovaj jezik. Tražili smo nešto zabavno, jedinstveno i lako pamtljivo. To je samo je slučajnost da je OxCAFEBABE, kosa referenca na slatke bariste u Peet's Coffeeu, nagoviještao naziv Java. "

Druga četiri bajta datoteke klase sadrže glavne i male brojeve verzija. Ti brojevi identificiraju verziju formata datoteke klase kojoj se pridržava određena datoteka klase i omogućuju JVM-ima da provjere je li datoteka klase dostupna za učitavanje. Svaki JVM ima maksimalnu verziju koju može učitati, a JVM će odbiti datoteke klase s novijim verzijama.

Stalni bazen

Datoteka klase čuva konstante povezane s njezinom klasom ili sučeljem u konstantnom spremištu. Neke konstante koje se mogu vidjeti kako brčkaju u spremištu su doslovni nizovi, konačne vrijednosti varijabli, nazivi klasa, nazivi sučelja, imena i tipovi varijabli te imena i potpisi metoda. Potpis metode je njezin povratni tip i skup tipova argumenata.

Stalni bazen organiziran je kao niz elemenata promjenjive duljine. Svaka konstanta zauzima jedan element u polju. U cijeloj datoteci klase na konstante se poziva cjelobrojni indeks koji označava njihov položaj u polju. Početna konstanta ima indeks jedan, druga konstanta ima indeks dva, itd. Nizu konstanti prethodi veličina polja, tako da će JVM znati koliko konstanti treba očekivati ​​prilikom učitavanja datoteke klase.

Svaki element spremišta konstanti započinje jednobajtnom oznakom koja specificira vrstu konstante na tom položaju u polju. Jednom kad JVM zgrabi i protumači ovu oznaku, zna što slijedi nakon oznake. Na primjer, ako oznaka označava da je konstanta niz, JVM očekuje da će sljedeća dva bajta biti duljina niza. Slijedeći ovu dvobajtnu duljinu, JVM očekuje da pronađe dužni broj bajtova, koji čine znakove niza.

U ostatku članka ponekad ću n-ti element niza konstantnog spremišta nazivati ​​constant_pool [n]. To ima smisla u mjeri u kojoj je konstantno spremište organizirano poput niza, ali imajte na umu da ti elementi imaju različite veličine i vrste i da prvi element ima indeks jedan.

Pristupne zastavice

Prva dva bajta nakon konstantnog spremišta, pristupne zastavice, naznačuju definira li ova datoteka klasu ili sučelje, je li klasa ili sučelje javna ili apstraktna i (ako je to klasa, a ne sučelje) hoće li klasa je konačan.

Ovaj sat

Sljedeća dva bajta, komponenta ove klase , indeks su konstantnog polja spremišta. Konstanta na koju se poziva ova klasa , constant_pool [this_class], ima dva dijela, jednobajtnu oznaku i dvobajtni indeks imena. Oznaka će biti jednaka CONSTANT_Class, vrijednost koja ukazuje da ovaj element sadrži informacije o klasi ili sučelju. Constant_pool [name_index] je konstanta niza koja sadrži ime klase ili sučelja.

Komponenta ove klase pruža uvid u to kako se koristi konstantni bazen. Sama je klasa samo indeks konstantnog spremišta. Kada JVM potraži konstantan_popust [ovaj_razred], pronalazi element koji se svojom oznakom identificira kao CONSTANT_Class. JVM zna da elementi CONSTANT_Class uvijek imaju dvobajtni indeks u spremištu konstanti, nazvan indeks imena, nakon njihove jednobajtne oznake. Dakle, traži constant_pool [name_index] kako bi se dobio niz koji sadrži ime klase ili sučelja.

Super klasa

Slijedi komponentu ove klase komponenta super klase , još jedan dvobajtni indeks u konstantno spremište. Constant_pool [super_class] je element CONSTANT_Class koji upućuje na ime super klase iz koje ova klasa potječe.

Sučelja

Komponenta sučelja započinje dvobajtnim brojem broja sučelja koje implementira klasa (ili sučelje) definirana u datoteci. Odmah slijedi niz koji sadrži jedan indeks u spremištu konstanti za svako sučelje koje implementira klasa. Svako sučelje je predstavljeno elementom CONSTANT_Class u spremištu konstanti koji pokazuje na ime sučelja.

Polja

Komponenta polja započinje dvobajtnim brojem broja polja u ovoj klasi ili sučelju. Polje je instanca ili varijabla klase klase ili sučelja. Nakon brojanja slijedi niz struktura promjenljive duljine, po jedna za svako polje. Svaka struktura otkriva informacije o jednom polju kao što su naziv polja, vrsta i, ako je konačna varijabla, njegova konstantna vrijednost. Neke se informacije nalaze u samoj strukturi, a neke na stalnim mjestima bazena na koja ukazuje struktura.

Na popisu se pojavljuju samo ona polja koja je deklarirala klasa ili sučelje definirano u datoteci; na popisu se ne pojavljuju polja naslijeđena od super klasa ili sučelja.

Metode

Komponenta metoda započinje dvobajtnim brojem broja metoda u klasi ili sučelju. Ovaj broj uključuje samo one metode koje je izričito definirala ova klasa, a ne bilo koje metode koje se mogu naslijediti od superklasa. Nakon broja metoda slijede same metode.

Struktura za svaku metodu sadrži nekoliko podataka o metodi, uključujući opisnik metode (njezin povratni tip i popis argumenata), broj složenih riječi potrebnih za lokalne varijable metode, maksimalan broj složenih riječi potrebnih za operand metode stog, tablica iznimaka koja je zahvaćena metodom, slijed bajt koda i tablica s brojevima linija.

Atributi

Od stražnjeg dijela nalaze se atributi koji daju opće informacije o određenoj klasi ili sučelju definiranom datotekom. Odjeljak atributa ima dvobajtni broj broja atributa, a zatim slijede sami atributi. Na primjer, jedan atribut je atribut izvornog koda; otkriva ime izvorne datoteke iz koje je sastavljena ova datoteka klase. JVM-ovi će tiho ignorirati sve atribute koje ne prepoznaju.

Učitavanje: simulacija datoteke klase koja dolazi do svog JVM odredišta

Aplet u nastavku simulira JVM učitavanje datoteke klase. Datoteku klase koja se učitava u simulaciji generirao je javac prevodilac s obzirom na sljedeći Java izvorni kod:

class Act {javna statička void doMathForever () {int i = 0; while (true) {i + = 1; i * = 2; }}}

Gornji isječak koda dolazi iz prošlomjesečnog članka o JVM-u. To je ista metoda doMathForever () koju je izvršio aplet EternalMath iz prošlomjesečnog članka. Odabrao sam ovaj kôd kako bih pružio stvaran primjer koji nije bio previše složen. Iako kôd možda nije vrlo koristan u stvarnom svijetu, on se kompajlira u stvarnu datoteku klase, koja se učitava donjom simulacijom.

Aplet GettingLoaded omogućuje vam vožnju simulacije opterećenja klase jedan po korak. Za svaki korak na putu možete pročitati o sljedećem dijelu bajtova koji će JVM potrošiti i protumačiti. Samo pritisnite gumb "Korak" da JVM potroši sljedeći dio. Pritiskom na "Natrag" poništit ćete prethodni korak, a pritiskom na "Poništi" vratit ćete simulaciju u prvobitno stanje, što vam omogućuje da započnete ispočetka.

JVM je prikazan dolje lijevo i troši tok bajtova koji čine datoteku klase Act.class. Bajtovi su prikazani u heksadecimalnom streamingu s poslužitelja u donjem desnom kutu. Bajtovi putuju zdesna ulijevo, između poslužitelja i JVM-a, jedan po jedan komad. Dio bajtova koji će JVM potrošiti pri sljedećem pritisku tipke "Korak" prikazan je crvenom bojom. Ovi istaknuti bajtovi opisani su u velikom području teksta iznad JVM-a. Svi preostali bajtovi nakon sljedećeg dijela prikazani su crnom bojom.

Pokušao sam u potpunosti objasniti svaki dio bajtova u području teksta. Stoga je u području teksta puno detalja i možda ćete prvo poželjeti pregledati sve korake da biste dobili opću ideju, a zatim potražite više detalja.

Sretan klik.

Za pregled ovog apleta potreban vam je preglednik s omogućenom Java.

Kliknite ovdje za izvorni kod GettingLoaded. Da biste samostalno pokrenuli ovaj aplet, trebat će vam i dvije datoteke koje ovaj aplet preuzima sa poslužitelja, ASCII datoteka koja sadrži tekst za svaki korak i sama datoteka Act.class. Kliknite ovdje za izvorni kod audio apleta Flying Class Files.

ZAVRŠNA NAPOMENA: Sitni tisak: Članak "Životni stil datoteke Java Class" Članak Copyright (c) 1996 Bill Venners. Sva prava pridržana. Aplet "GettingLoaded" Copyright (c) 1996 Artima Software Company. Sva prava pridržana.

: END_ENDNAPOMENA

Bill Venners predsjednik je tvrtke Artima Software. Preko Artime bavi se razvojem softvera po mjeri i savjetovanjem.

Saznajte više o ovoj temi

  • Specifikacija Java virtualnog stroja, službena riječ tvrtke Sun.

    //java.sun.com/1.0alpha3/doc/vmspec/vmspec_1.html

  • Kad izađe, knjiga Specifikacija virtualnog stroja Java , //www.aw.com/cp/lindholm-yellin.html, Tim Lindholm i Frank Yellin (ISBN 0-201-63452-X), dio Java Series, //www.aw.com/cp/javaseries.html), tvrtke Addison-Wesley, vjerojatno će biti najbolji JVM resurs.
  • Nacrt poglavlja 4 Specifikacije Java virtualnog stroja , koji opisuje format datoteke klase i verifikator bajt koda, može se preuzeti iz JavaSoft-a.

    //java.sun.com/java.sun.com/newdocs.html

Ovu priču, "Životni stil datoteke klase Java" izvorno je objavio JavaWorld.