Programmēšana

Java klases failu dzīvesveids

Laipni lūdzam citā "Zem pārsega" daļā. Pagājušā mēneša rakstā es apspriedu Java Virtual Machine jeb JVM - abstrakto datoru, kuram ir apkopotas visas Java programmas. Ja JVM jums nav pazīstams, iespējams, vēlēsities pirms šī izlasīt pagājušā mēneša rakstu. Šajā rakstā es ieskatu Java klases faila pamatstruktūrā un dzīvesveidā.

Dzimis ceļot

Java klases fails ir precīzi noteikts kompilētās Java formāts. Java pirmkods tiek apkopots klases failos, kurus var ielādēt un izpildīt jebkurš JVM. Klases faili var pārvietoties pa tīklu, pirms JVM tos ielādē.

Patiesībā, ja jūs lasāt šo rakstu, izmantojot pārlūkprogrammu, kurā var darboties Java, raksta beigās esošie simulācijas sīklietotnes klases faili šobrīd pārlido internetu uz jūsu datoru. Ja vēlaties tos klausīties (un jūsu datoram ir audio iespējas), nospiediet šo pogu:

Lai apskatītu šo sīklietotni, jums ir nepieciešama Java pārlūkprogramma

Izklausās, ka viņiem ir jautri, ja? Tas ir viņu dabā. Java klases faili tika izstrādāti, lai labi ceļotu. Viņi ir neatkarīgi no platformas, tāpēc būs laipni gaidīti vairākās vietās. Tajos ir baitkodi, kompakts JVM instrukciju komplekts, lai tie varētu pārvietoties viegli. Java klases faili nepārtraukti zip caur tīkliem ar milzīgu ātrumu, lai nokļūtu JVM visā pasaulē.

Kas ir klases failā?

Java klases failā ir viss, kas JVM jāzina par vienu Java klasi vai saskarni. Pēc izskata secības klases failā galvenie komponenti ir: maģija, versija, nemainīgs kopa, piekļuves karodziņi, šī klase, super klase, saskarnes, lauki, metodes un atribūti.

Klases failā saglabātās informācijas garums bieži atšķiras - tas ir, faktisko informācijas garumu nevar paredzēt pirms klases faila ielādes. Piemēram, metožu komponentā uzskaitīto metožu skaits klases failos var atšķirties, jo tas ir atkarīgs no pirmkodā definēto metožu skaita. Šāda informācija tiek sakārtota klases failā, iepriekšējo informāciju ievadot pēc tās lieluma vai garuma. Tādā veidā, kad JVM ielādē klasi, vispirms tiek nolasīts mainīga garuma informācijas lielums. Kad JVM zina izmēru, tas var pareizi nolasīt faktisko informāciju.

Informācija parasti tiek ierakstīta klases failā bez atstarpes vai aizpildīšanas starp secīgiem informācijas fragmentiem; viss ir saskaņots ar baitu robežām. Tas palīdz saglabāt klases failus sīku, lai, lidojot pa tīkliem, tie būtu aerodinamiski.

Klases faila komponentu secība ir stingri noteikta, lai JVM varētu ielādēt klases failu, ko un kur to sagaidīt. Piemēram, katrs JVM zina, ka klases faila pirmajos astoņos baitos ir burvju un versiju numuri, ka nemainīgais kopa sākas ar devīto baitu un ka piekļuves karodziņi seko nemainīgajam kopam. Bet, tā kā nemainīgais kopa ir mainīga garuma, tā nezina precīzu piekļuves karodziņu atrašanās vietu, kamēr nav pabeigusi lasīšanu nemainīgajā baseinā. Kad tas ir beidzis lasīt pastāvīgajā baseinā, tas zina, ka nākamie divi baiti būs piekļuves karodziņi.

Burvju un versiju numuri

Katra klases faila pirmie četri baiti vienmēr ir 0xCAFEBABE. Šis burvju skaitlis atvieglo Java klases failu identificēšanu, jo izredzes ir mazas, ka ne klases faili sāktos ar tiem pašiem sākotnējiem četriem baitiem. Skaitli sauc par maģiju, jo failu formātu izstrādātāji to var izvilkt no cepures. Vienīgā prasība ir tāda, ka to jau neizmanto cits faila formāts, kas var rasties reālajā pasaulē. Saskaņā ar sākotnējās Java komandas galveno dalībnieku Patriku Naughtonu, burvju numurs tika izvēlēts "ilgi pirms vārda Java kādreiz izrunāšanas, atsaucoties uz šo valodu. Mēs meklējām kaut ko jautru, unikālu un viegli atceramu. Tas ir tikai sakritība, ka OxCAFEBABE, kas ir slīpa atsauce uz Peet's Coffee jaukajām baristām, paredzēja vārdu Java. "

Klases faila otrajos četros baitos ir galvenās un mazākās versijas numuri. Šie skaitļi identificē klases faila formāta versiju, kurai atbilst konkrēts klases fails, un ļauj JVM pārbaudīt, vai klases fails ir ielādējams. Katram JVM ir maksimālā versija, kuru tā var ielādēt, un JVMs noraidīs klases failus ar jaunākām versijām.

Pastāvīgs baseins

Klases fails nemainīgajā baseinā saglabā konstantes, kas saistītas ar tās klasi vai saskarni. Dažas konstantes, kuras, iespējams, var redzēt, kā pūlēties, ir burtiskas virknes, galīgās mainīgo vērtības, klases nosaukumi, saskarnes nosaukumi, mainīgo nosaukumi un veidi, kā arī metožu nosaukumi un paraksti. Metode paraksts ir tā atgriešanās tips un argumentu tipu kopa.

Pastāvīgais baseins tiek organizēts kā mainīga garuma elementu masīvs. Katra konstante masīvā aizņem vienu elementu. Visā klases failā uz konstantēm atsaucas vesels skaitlis, kas norāda to pozīciju masīvā. Sākotnējās konstantes indekss ir viens, otrajai konstantei ir indekss diviem utt. Pastāvīgā kopas masīva priekšā ir tā masīva lielums, tāpēc JVM zinās, cik konstantes var sagaidīt, ielādējot klases failu.

Katrs nemainīgā kopas elements sākas ar viena baita tagu, norādot konstantes veidu šajā masīva pozīcijā. Kad JVM satver un interpretē šo tagu, tas zina, kas seko tagam. Piemēram, ja tags norāda, ka konstante ir virkne, JVM sagaida, ka nākamie divi baiti būs virknes garums. Pēc šī divu baitu garuma JVM cer atrast garums baitu skaits, kas veido virknes rakstzīmes.

Raksta atlikušajā daļā es pastāvīgā baseina masīva n-to elementu dažreiz atsaucos kā konstants_pool [n]. Tam ir jēga, ciktāl nemainīgais kopa tiek organizēta kā masīvs, taču paturiet prātā, ka šiem elementiem ir dažādi izmēri un veidi un ka pirmajam elementam ir viens indekss.

Piekļuves karodziņi

Pirmie divi baiti pēc nemainīgā kopas, piekļuves karodziņi, norāda, vai šajā failā ir definēta klase vai saskarne, vai klase vai saskarne ir publiska vai abstrakta, un (ja tā ir klase, nevis saskarne) vai klase ir galīgs.

Šī klase

Nākamie divi baiti, šī klase komponents ir indekss nemainīgā kopuma masīvā. Konstante, uz kuru atsaucas šī klase, konstants_pools [šī_klase], sastāv no divām daļām, viena baita taga un divu baitu nosaukumu indeksa. Taga būs vienāda ar CONSTANT_Class - vērtība, kas norāda, ka šis elements satur informāciju par klasi vai saskarni. Constant_pool [name_index] ir virknes konstante, kas satur klases vai saskarnes nosaukumu.

The šī klase komponents sniedz ieskatu, kā tiek izmantots nemainīgais baseins. Šī klase pati par sevi ir tikai indekss nemainīgajā baseinā. Kad JVM uzmeklē konstants_pool [šī_klase], tas atrod elementu, kas identificē sevi kā CONSTANT_Class ar savu tagu. JVM zina, ka CONSTANT_Class elementiem vienmēr ir divu baitu indekss nemainīgā krājumā, saukts par nosaukuma indeksu, pēc to viena baita taga. Tātad, lai iegūtu virkni, kurā ir klases vai saskarnes nosaukums, tiek meklēts konstants_pool [name_index].

Super klase

Pēc šī klase sastāvdaļa ir super klase komponents, vēl viens divu baitu indekss nemainīgajā baseinā. Constant_pool [super_class] ir CONSTANT_Class elements, kas norāda uz tās super klases nosaukumu, no kuras šī klase nokāpj.

Saskarnes

Saskarnes komponents sākas ar failā noteiktās klases (vai saskarnes) ieviesto saskarņu skaita divu baitu skaitu. Tūlīt seko masīvs, kas satur vienu indeksu nemainīgajā baseinā katram klases interfeisam. Katru interfeisu konstanta kopā attēlo CONSTANT_Class elements, kas norāda uz saskarnes nosaukumu.

Lauki

Lauku komponents sākas ar divu baitu šīs klases vai saskarnes lauku skaita skaitu. Lauks ir klases vai saskarnes instance vai klases mainīgais. Pēc skaitīšanas ir mainīga garuma struktūru masīvs, pa vienam katram laukam. Katra struktūra atklāj informāciju par vienu lauku, piemēram, lauka nosaukumu, tipu un, ja tas ir galīgais mainīgais, tā nemainīgo vērtību. Daļa informācijas ir pašā struktūrā, bet daļa - nemainīgās baseina vietās, uz kurām norāda struktūra.

Vienīgie lauki, kas parādās sarakstā, ir tie, kurus deklarēja failā noteiktā klase vai saskarne; sarakstā netiek parādīti lauki, kas mantoti no superklasēm vai superinterfeisiem.

Metodes

Metodes komponents sākas ar divu baitu metožu skaita skaitu klasē vai saskarnē. Šis skaitlis ietver tikai tās metodes, kuras ir skaidri definējusi šī klase, nevis metodes, kuras var mantot no augstākās klases. Pēc metožu skaitīšanas tiek izmantotas pašas metodes.

Katras metodes struktūra satur vairākas informācijas daļas par metodi, ieskaitot metodes deskriptoru (tā atgriešanas veidu un argumentu sarakstu), metodes lokālajiem mainīgajiem nepieciešamo kaudzes vārdu skaitu, maksimālo kaudzes vārdu skaitu, kas nepieciešams metodes operandam kaudze, metodes piesaistīto izņēmumu tabula, baitu kodu secība un rindu numuru tabula.

Atribūti

Paaugstināšana aizmugurē ir atribūti, kas sniedz vispārīgu informāciju par konkrēto klasi vai saskarni, kuru nosaka fails. Atribūtu sadaļā ir atribūtu skaita divu baitu skaits, kam seko paši atribūti. Piemēram, viens atribūts ir avota koda atribūts; tas atklāj avota faila nosaukumu, no kura tika sastādīts šis klases fails. JVM klusībā ignorēs visus neatpazītos atribūtus.

Notiek ielāde: klases faila simulācija, kas sasniedz JVM galamērķi

Zemāk esošais sīklietotne simulē JVM, ielādējot klases failu. Simulācijā ielādējamo klases failu ģenerēja javac kompilators, ņemot vērā šādu Java avota kodu:

klases likums {public static void doMathForever () {int i = 0; kamēr (taisnība) {i + = 1; i * = 2; }}} 

Iepriekš minētais koda fragments nāk no pagājušā mēneša raksta par JVM. Tā ir tā pati doMathForever () metode, kuru izpildīja EternalMath sīklietotne no pagājušā mēneša raksta. Es izvēlējos šo kodu, lai sniegtu reālu piemēru, kas nebija pārāk sarežģīts. Lai gan kods reālajā pasaulē var nebūt ļoti noderīgs, tas tiek apkopots reālā klases failā, kuru ielādē zemāk esošā simulācija.

Aplets GettingLoaded ļauj vadīt klases slodzes simulāciju pa vienam solim. Katram solim pa ceļam jūs varat izlasīt par nākamo baitu gabalu, kuru JVM gatavojas patērēt un interpretēt. Vienkārši nospiediet pogu "Solis", lai JVM patērētu nākamo gabalu. Nospiežot "Atpakaļ", iepriekšējais solis tiks atsaukts, un nospiežot "Atiestatīt", simulācija tiks atgriezta sākotnējā stāvoklī, ļaujot sākt no jauna.

JVM tiek parādīts apakšējā kreisajā stūrī, patērējot baitu plūsmu, kas veido klases failu Act.class. Baiti tiek parādīti sešstūru straumēšanas veidā no servera apakšējā labajā stūrī. Baidi pārvietojas pa labi pa kreisi, starp serveri un JVM, pa vienam gabalam. Baitu gabals, kas JVM jāizlieto nākamajā pogas "Step" nospiešanā, tiek parādīts sarkanā krāsā. Šie izceltie baiti ir aprakstīti lielajā teksta apgabalā virs JVM. Visi atlikušie baiti, kas atrodas tālāk par nākamo gabalu, tiek parādīti melnā krāsā.

Esmu mēģinājis pilnībā izskaidrot katru baitu gabalu teksta apgabalā. Tāpēc teksta apgabalā ir daudz detaļu, un vispirms, iespējams, vēlēsities pārlūkot visas darbības, lai iegūtu vispārēju ideju, pēc tam atskatieties, lai iegūtu sīkāku informāciju.

Priecīgu klikšķi.

Lai apskatītu šo sīklietotni, jums ir nepieciešama Java iespējota pārlūkprogramma.

Noklikšķiniet šeit, lai skatītu GettingLoaded avota kodu. Lai patstāvīgi palaistu šo sīklietotni, jums būs nepieciešami arī divi faili, kurus šī sīklietotne iegūst no servera, ASCII fails, kas satur katra soļa tekstu, un pats fails Act.class. Noklikšķiniet šeit, lai skatītu audio sīklietotnes Flying Class Files avota kodu.

ENDNOTE: Sīkā drukā: raksts "Java klases faila dzīvesveids" Autortiesības (c) 1996. gads Bils Venners. Visas tiesības aizsargātas. Applet "GettingLoaded" Autortiesības (c) 1996 Artima Software Company. Visas tiesības aizsargātas.

: END_ENDNOTE

Bils Venners ir programmatūras uzņēmuma Artima prezidents. Ar Artima starpniecību viņš veic pielāgotu programmatūras izstrādi un konsultācijas.

Uzziniet vairāk par šo tēmu

  • Java virtuālās mašīnas specifikācija, oficiālais Sun vārds.

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

  • Kad tas iznāk, grāmata Java virtuālās mašīnas specifikācija, //www.aw.com/cp/lindholm-yellin.html, autori: Tim Lindholm un Frank Yellin (ISBN 0-201-63452-X), daļa no Java sērijas, //www.aw.com/cp/ javaseries.html) no Addison-Wesley, iespējams, būs labākais JVM resurss.
  • Gada 4. Nodaļas melnraksts Java virtuālās mašīnas specifikācija, kas apraksta klases faila formātu un baitu kodu pārbaudītāju, var iegūt no JavaSoft.

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

Šo stāstu "Java klases failu dzīvesveids" sākotnēji publicēja JavaWorld.

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