Programiranje

Življenjski slog datoteke razreda Java

Dobrodošli v drugem delu "Pod pokrovom." V prejšnjem mesecu sem razpravljal o navideznem računalniku Java ali JVM, abstraktnem računalniku, za katerega so zbrani vsi programi Java. Če JVM ne poznate, boste morda želeli prebrati članek iz prejšnjega meseca pred tem. V tem članku vam predstavljam osnovno strukturo in življenjski slog datoteke razreda Java.

Rojen za potovanje

Datoteka razreda Java je natančno določena oblika za prevedeno Java. Izvorna koda Java se prevede v datoteke razredov, ki jih lahko naloži in izvede kateri koli JVM. Datoteke razreda lahko potujejo po omrežju, preden jih JVM naloži.

Če ta članek berete prek brskalnika, ki podpira Javo, datoteke razredov za simulacijski programček na koncu članka zdaj že letijo po internetu do vašega računalnika. Če jih želite poslušati (in vaš računalnik ima zvok), pritisnite naslednji gumb:

Za ogled tega programčka potrebujete brskalnik, ki podpira Java

Sliši se, kot da se zabavajo, kaj? To je v njihovi naravi. Datoteke razreda Java so bile zasnovane za dobro potovanje. So neodvisni od platforme, zato bodo dobrodošli v več krajih. Vsebujejo bajtode, kompaktna navodila za JVM, tako da lahko potujejo lahkotno. Datoteke razreda Java se ves čas vrtijo po omrežjih z neverjetno hitrostjo, da pridejo do JVM-jev po vsem svetu.

Kaj je v datoteki predavanja?

Datoteka razreda Java vsebuje vse, kar mora JVM vedeti o enem razredu ali vmesniku Java. Po vrstnem redu pojavljanja v datoteki razreda so glavne komponente: magija, različica, konstantno področje, zastavice dostopa, ta razred, super razred, vmesniki, polja, metode in atributi.

Podatki, shranjeni v datoteki razreda, se pogosto razlikujejo po dolžini - to pomeni, da dejanske dolžine informacij ni mogoče predvideti pred nalaganjem datoteke razreda. Število metod, navedenih v komponenti metod, se na primer lahko razlikuje med datotekami razredov, ker je odvisno od števila metod, opredeljenih v izvorni kodi. Takšne informacije so organizirane v datoteki razreda tako, da se dejanske informacije pripravijo po njihovi velikosti ali dolžini. Na ta način, ko JVM naloži razred, se najprej prebere velikost informacij s spremenljivo dolžino. Ko JVM ve velikost, lahko pravilno prebere dejanske informacije.

Informacije se praviloma zapisujejo v datoteko razreda brez presledka ali zapolnitve med zaporednimi informacijami; vse je poravnano na mejah bajtov. To pomaga, da so datoteke učil majhne, ​​da bodo aerodinamične, ko letijo po omrežjih.

Vrstni red komponent datoteke razreda je strogo določen, tako da lahko JVM vedo, kaj lahko pričakujejo in kje lahko pričakujejo pri nalaganju datoteke razreda. Vsak JVM na primer ve, da prvih osem bajtov datoteke razreda vsebuje čarovniške številke in številke različic, da se konstantno področje začne v devetem bajtu in da zastavice dostopa sledijo konstantnemu področju. Ker pa je konstantno področje spremenljive dolžine, ne ve natančno, kje so zastavice dostopa, dokler ne zaključi branja v konstantnem področju. Ko zaključi branje v konstantnem področju, ve, da bosta naslednja dva bajta zastavice dostopa.

Magija in številke različic

Prvi štirje bajti vsake datoteke razreda so vedno 0xCAFEBABE. Ta čarobna številka olajša prepoznavanje datotek razreda Java, ker je verjetnost, da bi se datoteke brez razreda začele z enakimi začetnimi štirimi bajti. Številka se imenuje magija, ker jo lahko oblikovalci datotek izvlečejo iz klobuka. Edina zahteva je, da je še ne uporablja druga oblika zapisa datoteke, ki bi jo lahko srečali v resničnem svetu. Po besedah ​​Patricka Naughtona, ključnega člana prvotne ekipe Java, je bila čarobna številka izbrana "že dolgo, preden je bilo ime Java kdaj izgovorjeno v zvezi s tem jezikom. Iskali smo nekaj zabavnega, edinstvenega in enostavnega za zapomnitev. To je samo naključje je, da je OxCAFEBABE, poševno sklicevanje na prikupne bariste v Peet's Coffee, nakazal ime Java. "

Drugi štirje bajti datoteke razreda vsebujejo glavne in manjše številke različic. Te številke opredeljujejo različico oblike datoteke razreda, na katero se drži določena datoteka razreda, in omogočajo JVM-jem, da preverijo, ali je datoteko razreda mogoče naložiti. Vsak JVM ima največjo različico, ki jo lahko naloži, in JVM zavrne datoteke razredov s poznejšimi različicami.

Stalni bazen

Datoteka razreda shrani konstante, povezane z njenim razredom ali vmesnikom, v konstantno področje. Nekatere konstante, ki jih lahko opazimo v bazenu, so dobesedni nizi, končne vrednosti spremenljivk, imena razredov, imena vmesnikov, imena in tipi spremenljivk ter imena in podpisi metod. Metoda podpis je njegova vrsta vrnitve in nabor vrst argumentov.

Stalno področje je organizirano kot niz elementov spremenljive dolžine. Vsaka konstanta zavzema en element v matriki. V celotni datoteki razreda se na konstante sklicuje celoštevilski indeks, ki označuje njihov položaj v matriki. Začetna konstanta ima indeks ena, druga konstanta ima indeks dva itd. Pred matriko konstante je njegova velikost matrike, zato bodo JVM vedeli, koliko konstant lahko pričakujejo pri nalaganju datoteke razreda.

Vsak element področja konstant se začne z enobajtno oznako, ki določa vrsto konstante na tem položaju v matriki. Ko JVM zgrabi in interpretira to oznako, ve, kaj sledi oznaki. Če na primer oznaka označuje, da je konstanta niz, JVM pričakuje, da bosta naslednja dva bajta dolžina niza. Po tej dvobajtni dolžini JVM pričakuje, da bo našel dolžina število bajtov, ki sestavljajo znake niza.

V nadaljevanju članka se bom včasih skliceval na n-ti element matrike konstantnega bazena kot constant_pool [n]. To je smiselno, kolikor je konstantni bazen organiziran kot matrika, vendar ne pozabite, da imajo ti elementi različne velikosti in vrste ter da ima prvi element indeks ena.

Dostopne zastavice

Prva dva bajta za konstantnim področjem, zastavice dostopa, označujeta, ali ta datoteka definira razred ali vmesnik, ali je razred ali vmesnik javen ali abstrakten in (če gre za razred in ne za vmesnik), ali je razred je dokončno.

Ta razred

Naslednja dva bajta, ta razred komponenta, so indeks v matriki konstantnega področja. Konstanta, na katero se sklicuje ta razred, constant_pool [this_class], ima dva dela, enobajtno oznako in dvobajtni indeks imen. Oznaka bo enaka CONSTANT_Class, vrednost, ki označuje, da ta element vsebuje informacije o razredu ali vmesniku. Constant_pool [name_index] je nizna konstanta, ki vsebuje ime razreda ali vmesnika.

The ta razred komponenta ponuja vpogled v to, kako se uporablja konstantno področje. Ta razred je samo indeks konstantnega področja. Ko JVM poišče constant_pool [this_class], najde element, ki se s svojo oznako identificira kot CONSTANT_Class. JVM ve, da imajo elementi CONSTANT_Class vedno dvobajtni indeks v konstantno področje, imenovan imenski indeks, ki sledi njihovi enobajtni oznaki. Torej poišče konstant_pool [name_index], da dobi niz, ki vsebuje ime razreda ali vmesnika.

Super razred

Po ta razred komponenta je super razred komponenta, še en dvobajtni indeks v konstantno področje. Constant_pool [super_class] je element CONSTANT_Class, ki kaže na ime super razreda, iz katerega ta razred izhaja.

Vmesniki

Komponenta vmesnikov se začne z dvobajtnim številom števila vmesnikov, ki jih izvaja razred (ali vmesnik), definiran v datoteki. Takoj sledi matrika, ki vsebuje en indeks v konstantnem področju za vsak vmesnik, ki ga izvaja razred. Vsak vmesnik je predstavljen z elementom CONSTANT_Class v konstantnem področju, ki kaže na ime vmesnika.

Polja

Komponenta polj se začne z dvobajtnim številom števila polj v tem razredu ali vmesniku. Polje je primerek ali spremenljivka razreda razreda ali vmesnika. Po štetju je niz struktur spremenljive dolžine, po eno za vsako polje. Vsaka struktura razkrije informacije o enem polju, kot so ime polja, vrsta in, če je končna spremenljivka, njegova konstantna vrednost. Nekatere informacije so v sami strukturi, nekatere pa na stalnih lokacijah bazena, na katere kaže struktura.

Na seznamu se prikažejo le polja, ki jih je prijavil razred ali vmesnik, definiran v datoteki; na seznamu se ne prikažejo polja, podedovana od super razredov ali supervmesnikov.

Metode

Komponenta metode se začne z dvobajtnim številom števila metod v razredu ali vmesniku. To štetje vključuje samo tiste metode, ki jih ta razred izrecno opredeli, ne pa nobenih metod, ki jih je mogoče podedovati iz superrazredov. Po štetju metod sledijo same metode.

Struktura za vsako metodo vsebuje več podatkov o metodi, vključno z deskriptorjem metode (njen vrnjeni tip in seznam argumentov), ​​številom besed za sklad, potrebnih za lokalne spremenljivke metode, največjim številom besed za sklad, potrebnih za operand metode stack, tabela izjem, zajeta v metodi, zaporedje bajt kod in tabela s številkami vrstic.

Lastnosti

Spredaj so atributi, ki dajejo splošne informacije o določenem razredu ali vmesniku, ki ga definira datoteka. Odsek atributov ima dvobajtno število števila atributov, čemur sledijo atributi sami. Na primer, en atribut je atribut izvorne kode; razkrije ime izvorne datoteke, iz katere je bila sestavljena ta datoteka razreda. JVM bodo tiho prezrli vse atribute, ki jih ne prepoznajo.

Nalaganje: simulacija datoteke razreda, ki doseže cilj JVM

Spodnji programček simulira JVM, ki nalaga datoteko razreda. Datoteko razreda, ki se naloži v simulaciji, je prevajalnik javac ustvaril z naslednjo izvorno kodo Java:

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

Zgornji delček kode izhaja iz prejšnjemesečnega članka o JVM. Gre za isto metodo doMathForever (), ki jo je izvedel programček EternalMath iz prejšnjega meseca. To kodo sem izbral za resničen primer, ki ni bil preveč zapleten. Čeprav koda v resničnem svetu morda ni zelo uporabna, se prevede v datoteko pravega razreda, ki jo naloži spodnja simulacija.

Applet GettingLoaded vam omogoča simulacijo obremenitve razreda po korakih. Za vsak korak na tej poti lahko preberete o naslednjem delu bajtov, ki ga bo JVM porabil in interpretiral. Preprosto pritisnite gumb "Korak", da JVM porabi naslednji kos. Če pritisnete "Nazaj", boste razveljavili prejšnji korak, s pritiskom na "Ponastavi" pa boste simulacijo vrnili v prvotno stanje, kar vam omogoča, da začnete znova od začetka.

Spodaj levo je prikazan JVM, ki porabi tok bajtov, ki sestavljajo datoteko razreda Act.class. Bajti so prikazani v šestnajstiškem pretakanju iz strežnika spodaj desno. Bajti potujejo desno na levo, med strežnikom in JVM, en kos naenkrat. Del bajtov, ki jih mora JVM porabiti pri naslednjem pritisku gumba "Korak", je prikazan rdeče. Ti poudarjeni bajti so opisani v velikem besedilnem območju nad JVM. Vsi preostali bajti po naslednjem delu so prikazani v črni barvi.

Poskušal sem v celoti razložiti vsak del bajtov v besedilnem območju. V območju z besedilom je torej veliko podrobnosti, zato boste morda želeli najprej prebrati vse korake, da boste dobili splošno idejo, nato pa si oglejte podrobnosti.

Vesel klik.

Za ogled tega programčka potrebujete brskalnik, ki podpira Java.

Kliknite tukaj za izvorno kodo GettingLoaded. Če želite zagnati ta programček sami, boste potrebovali tudi dve datoteki, ki jih ta programček pridobi s strežnika, datoteko ASCII, ki vsebuje besedilo za vsak korak, in samo datoteko Act.class. Kliknite tukaj za izvorno kodo avdio programa Flying Class Files.

KONEC: Droben tisk: Članek "Življenjski slog datoteke razreda Java" Article Copyright (c) 1996 Bill Venners. Vse pravice pridržane. Applet "GettingLoaded" Copyright (c) 1996 Artima Software Company. Vse pravice pridržane.

: END_END OPOMBA

Bill Venners je predsednik podjetja Artima Software Company. Prek Artime se ukvarja z razvojem programske opreme in svetovanjem po meri.

Preberite več o tej temi

  • Java Virtual Machine Specification, uradna beseda podjetja Sun.

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

  • Ko pride ven, knjiga Specifikacija navideznega računalnika Java, //www.aw.com/cp/lindholm-yellin.html, Tim Lindholm in Frank Yellin (ISBN 0-201-63452-X), del serije Java, //www.aw.com/cp/ javaseries.html), od Addison-Wesley, bo verjetno najboljši vir JVM.
  • Osnutek poglavja 4 Specifikacija navideznega računalnika Java, ki opisuje obliko datoteke razreda in preveritelj bajtkode, je mogoče dobiti iz JavaSoft.

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

To zgodbo "Življenjski slog datoteke razreda Java" je prvotno objavil JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found