Programavimas

„Java“ klasės failų gyvenimo būdas

Sveiki atvykę į kitą „Po gaubtu“ dalį. Praėjusio mėnesio straipsnyje aptariau „Java Virtual Machine“ arba „JVM“ - abstraktų kompiuterį, kuriam sudarytos visos „Java“ programos. Jei JVM jums nepažįstamas, galbūt norėsite perskaityti praėjusio mėnesio straipsnį prieš šį. Šiame straipsnyje apžvelgiu pagrindinę „Java“ klasės failo struktūrą ir gyvenimo būdą.

Gimė keliauti

„Java“ klasės failas yra tiksliai apibrėžtas kompiliuojamos „Java“ formatas. „Java“ šaltinio kodas yra sudarytas į klasės failus, kuriuos gali įkelti ir vykdyti bet kuris JVM. Klasės failai gali keliauti per tinklą prieš juos įkeldami JVM.

Tiesą sakant, jei skaitote šį straipsnį per „Java“ palaikančią naršyklę, straipsnio pabaigoje esantys modeliavimo programėlės failai šiuo metu skraido internete į jūsų kompiuterį. Jei norite jų klausytis (o jūsų kompiuteryje yra garso galimybių), paspauskite šį mygtuką:

Jums reikia „Java“ palaikančios naršyklės, kad galėtumėte peržiūrėti šią programėlę

Panašu, kad jie linksminasi, ką? Tai jų prigimtyje. „Java“ klasės failai buvo sukurti gerai keliauti. Jie nepriklauso nuo platformos, todėl bus laukiami daugiau vietų. Juose yra baitų kodai, kompaktiškas JVM instrukcijų rinkinys, todėl jie gali keliauti lengvai. „Java“ klasės failai nuolat veržiasi per tinklus nepaprastu greičiu, kad pasiektų JVM visame pasaulyje.

Kas yra klasės faile?

„Java“ klasės faile yra viskas, ką JVM turi žinoti apie vieną „Java“ klasę ar sąsają. Pagal jų eiliškumą klasės faile pagrindiniai komponentai yra: magija, versija, pastovus telkinys, prieigos žymos, ši klasė, super klasė, sąsajos, laukai, metodai ir atributai.

Klasės faile saugomos informacijos ilgis dažnai skiriasi - tai yra, prieš įkeliant klasės failą, negalima numatyti tikrojo informacijos ilgio. Pavyzdžiui, metodų komponente nurodytų metodų skaičius gali skirtis klasės failuose, nes tai priklauso nuo šaltinio kode apibrėžtų metodų skaičiaus. Tokia informacija yra suskirstyta į klasės failą, įvedant faktinę informaciją pagal jos dydį ar ilgį. Tokiu būdu, kai klasę įkelia JVM, pirmiausia skaitomas kintamo ilgio informacijos dydis. Kai JVM žino dydį, jis gali teisingai perskaityti tikrąją informaciją.

Informacija paprastai įrašoma į klasės bylą be vietos ir tarpo iš eilės pateikiamų informacijos; viskas suderinta pagal baitų ribas. Tai padeda išlaikyti klasės failus mažus, todėl jie bus aerodinamiški, kai jie skraido tinklais.

Klasės failų komponentų tvarka yra griežtai apibrėžta, kad JVM galėtų žinoti, ko tikėtis ir kur to tikėtis, kai įkeliama klasės byla. Pvz., Kiekvienas JVM žino, kad pirmuose aštuoniuose klasės failo baituose yra magija ir versijų numeriai, kad pastovus telkinys prasideda nuo devinto baito ir kad prieigos žymos eina po pastovaus telkinio. Kadangi pastovus baseinas yra kintamo ilgio, jis tiksliai nežino prieigos vėliavų buvimo vietos, kol nebaigs skaityti pastoviame baseine. Baigęs skaityti nuolatiniame baseine, jis žino, kad kiti du baitai bus prieigos vėliavos.

Magija ir versijų numeriai

Pirmieji keturi kiekvienos klasės failo baitai visada yra 0xCAFEBABE. Šis stebuklingas skaičius leidžia lengviau identifikuoti „Java“ klasės failus, nes tikimybė, kad ne klasės failai prasidėtų tais pačiais pradiniais keturiais baitais, yra nedideli. Skaičius vadinamas magija, nes failų formatų kūrėjai gali jį ištraukti iš skrybėlės. Vienintelis reikalavimas yra tai, kad jo dar nenaudoja kitas failo formatas, su kuriuo gali susidurti realiame pasaulyje. Pasak Patricko Naughtono, pagrindinio pirminės „Java“ komandos nario, stebuklingas numeris buvo pasirinktas „ilgai, kol dar nebuvo ištartas„ Java “vardas, kalbant apie šią kalbą. Mes ieškojome kažko linksmo, unikalaus ir lengvai įsimenamo. tik sutapimas, kad OxCAFEBABE, pasvirusi nuoroda į mielus baristus „Peet's Coffee“, iš anksto numatė Java vardą “.

Antruose keturiuose klasės failo baituose yra pagrindinės ir antrinės versijų numeriai. Šie skaičiai nurodo klasės failo formato versiją, kurios laikosi tam tikras klasės failas, ir leidžia JVM patikrinti, ar klasės failą galima įkelti. Kiekvienas JVM turi maksimalią versiją, kurią jis gali įkelti, ir JVM atmes klasės failus su vėlesnėmis versijomis.

Nuolatinis baseinas

Klasės faile konstantos, susietos su jos klase ar sąsaja, saugomos pastoviame baseine. Kai kurios konstantos, kurios gali būti vertinamos siautulingai, yra pažodinės eilutės, galutinės kintamųjų reikšmės, klasių pavadinimai, sąsajų pavadinimai, kintamųjų pavadinimai ir tipai, metodų pavadinimai ir parašai. Metodas parašas yra jo grąžinimo tipas ir argumentų tipų rinkinys.

Nuolatinis baseinas yra organizuojamas kaip kintamo ilgio elementų masyvas. Kiekviena konstanta užima vieną masyvo elementą. Visoje klasės byloje konstantos nurodomos sveikojo skaičiaus indeksu, nurodančiu jų padėtį masyve. Pradinės konstantos indeksas yra vienas, antrosios konstantos indeksas yra du ir t. T. Prieš pastovų telkinio masyvą nurodomas jo masyvo dydis, todėl JVM žinos, kiek konstantų galima tikėtis įkeliant klasės failą.

Kiekvienas pastovaus telkinio elementas prasideda vieno baito žyma, nurodančia konstantos tipą toje masyvo vietoje. Kai JVM griebia ir interpretuoja šią žymą, jis žino, kas eina po žymos. Pvz., Jei žyma rodo, kad konstanta yra eilutė, JVM tikisi, kad kiti du baitai bus eilutės ilgis. Laikydamasi šio dviejų baitų ilgio, JVM tikisi rasti ilgio baitų, sudarančių eilutės simbolius, skaičius.

Straipsnio likusioje dalyje aš nurodysiu pastovų baseino masyvo n-ąjį elementą kaip konstanta_ baseinas [n]. Tai prasminga tiek, kiek pastovus telkinys yra organizuotas kaip masyvas, tačiau nepamirškite, kad šie elementai turi skirtingus dydžius ir tipus ir kad pirmasis elementas turi vieno indeksą.

Prieigos vėliavos

Pirmieji du baitai po pastovaus telkinio, prieigos žymos, nurodo, ar šis failas apibrėžia klasę, ar sąsają, ar klasė ar sąsaja yra vieša, ar abstrakti, ir (jei tai klasė, o ne sąsaja), ar klasė yra galutinis.

Ši klasė

Kiti du baitai, šios klasės komponentas yra indeksas į pastovų telkinių masyvą. Pastovioji, kurią nurodo šios klasės, permanent_pool [this_class], turi dvi dalis, vieno baito žymą ir dviejų baitų vardų rodyklę. Žyma bus lygi CONSTANT_Class - reikšmė, nurodanti, kad šiame elemente yra informacijos apie klasę ar sąsają. „Constant_pool“ [name_index] yra eilutės konstanta, kurioje yra klasės ar sąsajos pavadinimas.

šios klasės komponentas suteikia žvilgsnį, kaip naudojamas pastovus baseinas. Ši klasė pati yra tik indeksas į nuolatinį telkinį. Kai JVM ieško constant_pool [this_class], jis randa elementą, kuris su savo žyma identifikuoja save kaip CONSTANT_Class. JVM žino, kad CONSTANT_Class elementai visada turi dviejų baitų indeksą pastoviame telkinyje, vadinamą vardų indeksu, po jų vieno baito žyma. Taigi, norint gauti eilutę su klasės ar sąsajos pavadinimu, ieškoma konstanta_poolas [vardas_indeksas].

Super klasė

Sekant šios klasės komponentas yra super klasė komponentas, kitas dviejų baitų indeksas į pastovų telkinį. „Constant_pool“ [super_class] yra elementas CONSTANT_Class, kuris nurodo super klasės, iš kurios ši klasė nusileidžia, pavadinimą.

Sąsajos

Sąsajų komponentas prasideda dviejų baitų skaičiumi sąsajų, kurias įgyvendina faile apibrėžta klasė (arba sąsaja), skaičiaus. Iš karto pateikiamas masyvas, kuriame yra vienas indeksas į kiekvienos klasės sąsajos pastovųjį telkinį. Kiekvieną sąsają pastoviame telkinyje rodo CONSTANT_Class elementas, nurodantis sąsajos pavadinimą.

Laukai

Laukų komponentas prasideda dviejų baitų šios klasės ar sąsajos laukų skaičiumi. Laukas yra klasės ar sąsajos egzempliorius arba klasės kintamasis. Po skaičiavimo yra kintamo ilgio struktūrų masyvas, po vieną kiekvienam laukui. Kiekviena struktūra atskleidžia informaciją apie vieną lauką, pvz., Lauko pavadinimą, tipą ir, jei tai yra galutinis kintamasis, jo pastovią vertę. Dalis informacijos yra pačioje struktūroje, o dalis yra pastoviose baseino vietose, į kurias atkreipia dėmesį struktūra.

Vieninteliai laukai, kurie rodomi sąraše, yra tie, kuriuos deklaravo faile apibrėžta klasė arba sąsaja; sąraše nerodomi jokie laukai, paveldėti iš super klasių ar superinterfų.

Metodai

Metodų komponentas prasideda dviejų baitų skaičiaus metodų skaičiumi klasėje arba sąsajoje. Į šį skaičių įskaičiuojami tik tie metodai, kuriuos aiškiai apibrėžia ši klasė, o ne metodai, kurie gali būti paveldėti iš superklasių. Po metodų skaičiavimo yra patys metodai.

Kiekvieno metodo struktūroje yra keletas informacijos apie metodą, įskaitant metodo deskriptorių (jo grąžinimo tipą ir argumentų sąrašą), krūvos žodžių, reikalingų metodo vietiniams kintamiesiems, skaičių, didžiausią kaupiamų žodžių skaičių, reikalingą metodo operandui kamino, metodo sugautų išimčių lentelę, baitų kodų seką ir eilutės numerių lentelę.

Atributai

Galinės dalies pakėlimas yra atributai, suteikiantys bendrą informaciją apie konkrečią failo apibrėžtą klasę ar sąsają. Atributų skiltyje yra dviejų baitų atributų skaičiaus skaičius, po kurio nurodomi patys atributai. Pavyzdžiui, vienas atributas yra šaltinio kodo atributas; jis atskleidžia šaltinio failo, iš kurio buvo sudarytas šios klasės failas, pavadinimą. JVM tyliai ignoruos atributus, kurių jie neatpažįsta.

Įkeliama: klasės failo, pasiekiančio JVM tikslą, modeliavimas

Žemiau esanti programėlė imituoja JVM, įkeliantį klasės failą. Simuliacijoje įkeliamą klasės failą sugeneravo „javac“ kompiliatorius, pateikdamas šį „Java“ šaltinio kodą:

klasės aktas {public static void doMathForever () {int i = 0; o (tiesa) {i + = 1; i * = 2; }}} 

Pirmiau pateiktas kodo fragmentas yra iš praėjusio mėnesio straipsnio apie JVM. Tai tas pats metodas „doMathForever“ (), kurį vykdė „EternalMath“ programėlė iš praėjusio mėnesio straipsnio. Pasirinkau šį kodą, kad pateikčiau tikrą pavyzdį, kuris nebuvo per daug sudėtingas. Nors kodas gali būti nelabai naudingas realiame pasaulyje, jis kompiliuojamas į tikrą klasės failą, kurį įkelia žemiau pateikta simuliacija.

„GettingLoaded“ programėlė leidžia vairuoti klasės apkrovos modeliavimą po vieną žingsnį. Kiekviename žingsnyje galite perskaityti kitą baitų dalį, kurią netrukus suvartos ir interpretuos JVM. Tiesiog paspauskite mygtuką „Veiksmas“, kad JVM sunaudotų kitą gabalėlį. Paspaudus „Atgal“ bus anuliuotas ankstesnis žingsnis, o paspaudus „Atstatyti“, modeliavimas bus grąžintas į pradinę būseną, leidžiančią pradėti nuo pradžių.

JVM rodomas apačioje kairėje, vartojant baitų srautą, kuris sudaro klasės failą „Act.class“. Baitai rodomi šešioliktainiu srautu iš serverio apačioje dešinėje. Baitai keliauja iš dešinės į kairę, tarp serverio ir JVM, po vieną gabalą. Baitų dalis, kurią suvartos JVM, paspaudus mygtuką „Step“, bus rodomi raudonai. Šie paryškinti baitai aprašomi didelėje teksto srityje virš JVM. Likę baitai už kito gabalo yra rodomi juodai.

Pabandžiau išsamiai paaiškinti kiekvieną baitų dalį teksto srityje. Todėl teksto srityje yra daug detalių, todėl pirmiausia norėsite pereiti visus veiksmus, kad gautumėte bendrą idėją, tada ieškokite daugiau informacijos.

Laimingo spustelėjimo.

Jums reikia „Java“ palaikančios naršyklės, kad galėtumėte peržiūrėti šią programėlę.

Spustelėkite čia, jei norite gauti „GettingLoaded“ šaltinio kodą. Norėdami savarankiškai paleisti šią programėlę, jums taip pat reikės dviejų failų, kuriuos ši programėlė gauna iš serverio, ASCII failo, kuriame yra kiekvieno veiksmo tekstas, ir paties failo Act.class. Spustelėkite čia, kad gautumėte „Flying Class Files“ garso programėlės šaltinio kodą.

PASTABA: Mažas šriftas: „Java klasės failų gyvenimo būdas“ straipsnis. Autorių teisės (c), 1996 m. Billas Vennersas. Visos teisės saugomos. „GettingLoaded“ programėlė Autorių teisės (c) 1996 m. „Artima“ programinė įranga. Visos teisės saugomos.

: END_ENDNOTE

Billas Vennersas yra „Artima Software Company“ prezidentas. Per „Artima“ jis kuria individualų programinę įrangą ir konsultuoja.

Sužinokite daugiau apie šią temą

  • „Java“ virtualiosios mašinos specifikacija, oficialus „Sun“ žodis.

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

  • Kai pasirodys, knyga „Java“ virtualiosios mašinos specifikacija, //www.aw.com/cp/lindholm-yellin.html, autoriai Tim Lindholm ir Frank Yellin (ISBN 0-201-63452-X), „Java“ serijos dalis, //www.aw.com/cp/ javaseries.html) iš Addison-Wesley greičiausiai bus geriausias JVM šaltinis.
  • 4 skyriaus juodraštis „Java“ virtualiosios mašinos specifikacija, kuris apibūdina klasės failo formatą ir baitų kodų tikrintuvą, galima gauti iš „JavaSoft“.

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

Šią istoriją „Java klasės failų gyvenimo būdas“ iš pradžių paskelbė „JavaWorld“.