Gaya hidup fail kelas Java

Selamat datang ke ansuran lain "Under the Hood." Dalam artikel bulan lalu saya membincangkan Java Virtual Machine, atau JVM, komputer abstrak yang mana semua program Java disusun. Sekiranya anda tidak mahir dengan JVM, anda mungkin ingin membaca artikel bulan lalu sebelum ini. Dalam artikel ini saya memberikan gambaran mengenai struktur dan gaya hidup asas fail kelas Java.

Dilahirkan untuk melancong

Fail kelas Java adalah format yang ditentukan dengan tepat untuk Java yang dikompilasi. Kod sumber Java disusun ke dalam fail kelas yang dapat dimuat dan dijalankan oleh JVM mana pun. Fail kelas boleh bergerak di seluruh rangkaian sebelum dimuat oleh JVM.

Sebenarnya, jika anda membaca artikel ini melalui penyemak imbas berkemampuan Java, fail kelas untuk applet simulasi di akhir artikel akan melintasi Internet ke komputer anda sekarang. Sekiranya anda ingin mendengarnya (dan komputer anda mempunyai kemampuan audio), tekan butang berikut:

Anda memerlukan penyemak imbas berkemampuan Java untuk melihat applet ini

Kedengarannya mereka bersenang-senang, ya? Itu dalam sifat mereka. Fail kelas Java dirancang untuk berjalan dengan baik. Mereka bebas platform, jadi mereka akan disambut di lebih banyak tempat. Mereka mengandungi kod bytek, set arahan ringkas untuk JVM, sehingga mereka dapat bergerak ringan. Fail kelas Java sentiasa melayari rangkaian dengan kecepatan tinggi untuk tiba di JVM di seluruh dunia.

Apa yang ada dalam fail kelas?

Fail kelas Java mengandungi semua yang perlu diketahui oleh JVM mengenai satu kelas atau antara muka Java. Dalam susunan penampilan mereka dalam fail kelas, komponen utama adalah: sihir, versi, kumpulan tetap, bendera akses, kelas ini, kelas super, antara muka, medan, kaedah, dan atribut.

Maklumat yang disimpan dalam fail kelas selalunya panjangnya berbeza - iaitu panjang maklumat sebenarnya tidak dapat diramalkan sebelum memuatkan fail kelas. Sebagai contoh, jumlah kaedah yang disenaraikan dalam komponen kaedah boleh berbeza di antara fail kelas, kerana bergantung pada jumlah kaedah yang ditentukan dalam kod sumber. Maklumat tersebut disusun dalam fail kelas dengan mengawali maklumat sebenar mengikut ukuran atau panjangnya. Dengan cara ini, semasa kelas dimuat oleh JVM, ukuran maklumat panjang berubah dibaca terlebih dahulu. Setelah JVM mengetahui ukurannya, ia dapat membaca dengan betul maklumat sebenar.

Maklumat secara umum ditulis ke fail kelas tanpa ruang atau ruang antara maklumat yang berturut-turut; semuanya selaras dengan had bait. Ini membantu membuat fail kelas tetap kecil sehingga akan menjadi aerodinamik semasa mereka melintasi rangkaian.

Urutan komponen fail kelas ditentukan dengan ketat sehingga JVM dapat mengetahui apa yang diharapkan, dan di mana mengharapkannya, semasa memuatkan fail kelas. Sebagai contoh, setiap JVM mengetahui bahawa lapan bait pertama dari kelas kelas mengandungi nombor ajaib dan versi, bahawa kumpulan tetap bermula pada bait kesembilan, dan bahawa bendera akses mengikuti kumpulan tetap. Tetapi kerana kumpulan tetap panjangnya berubah-ubah, ia tidak mengetahui lokasi sebenar bendera akses sehingga selesai membaca di kolam tetap. Setelah selesai membaca di kolam berterusan, ia tahu dua bait seterusnya akan menjadi bendera akses.

Nombor sihir dan versi

Empat bait pertama dari setiap fail kelas selalu 0xCAFEBABE. Nombor sihir ini menjadikan fail kelas Java lebih mudah dikenali, kerana kemungkinannya sangat kecil sehingga fail bukan kelas akan dimulakan dengan empat bait awal yang sama. Angka itu disebut sihir kerana dapat dikeluarkan dari topi oleh pereka format fail. Satu-satunya syarat adalah bahawa ia belum digunakan oleh format fail lain yang mungkin ditemui di dunia nyata. Menurut Patrick Naughton, ahli utama pasukan Java yang asli, nombor ajaib itu dipilih "jauh sebelum nama Java diucapkan merujuk kepada bahasa ini. Kami mencari sesuatu yang menyeronokkan, unik, dan mudah diingat. Ini adalah hanya kebetulan bahawa OxCAFEBABE, rujukan serong kepada barista yang comel di Peet's Coffee, telah menunjukkan nama Java. "

Empat bait kedua dari fail kelas mengandungi nombor versi utama dan kecil. Nombor-nombor ini mengenal pasti versi format fail kelas yang dipatuhi oleh fail kelas tertentu dan membolehkan JVM mengesahkan bahawa fail kelas boleh dimuat. Setiap JVM mempunyai versi maksimum yang dapat dimuat, dan JVM akan menolak fail kelas dengan versi yang lebih baru.

Kolam berterusan

Fail kelas menyimpan pemalar yang berkaitan dengan kelas atau antara muka dalam kumpulan tetap. Beberapa pemalar yang dapat dilihat bermain di kolam adalah rentetan literal, nilai pemboleh ubah akhir, nama kelas, nama antara muka, nama dan jenis pemboleh ubah, dan nama kaedah dan tandatangan. Tandatangan kaedah adalah jenis pengembalian dan jenis argumen.

Kumpulan tetap diatur sebagai susunan elemen panjang berubah-ubah. Setiap pemalar menempati satu elemen dalam tatasusunan. Sepanjang fail kelas, pemalar disebut oleh indeks integer yang menunjukkan kedudukan mereka dalam array. Pemalar awal mempunyai indeks satu, pemalar kedua mempunyai indeks dua, dan lain-lain. Susunan kumpulan tetap didahului dengan ukuran susunannya, jadi JVM akan mengetahui berapa banyak pemalar yang diharapkan ketika memuatkan fail kelas.

Setiap elemen kumpulan tetap dimulakan dengan tag satu-bait yang menentukan jenis pemalar pada kedudukan dalam larik. Setelah JVM mengambil dan menafsirkan teg ini, ia tahu apa yang mengikuti teg tersebut. Contohnya, jika teg menunjukkan pemalar adalah rentetan, JVM menjangkakan dua bait seterusnya adalah panjang rentetan. Berikutan panjang dua bait ini, JVM berharap dapat menemui bilangan bait panjang , yang membentuk watak rentetan.

Dalam baki artikel saya kadang-kadang akan merujuk kepada unsur ke-9 susunan kumpulan tetap sebagai constan_pool [n]. Ini masuk akal sejauh kumpulan konstan diatur seperti susunan, tetapi perlu diingat bahawa elemen-elemen ini mempunyai ukuran dan jenis yang berbeza dan elemen pertama mempunyai indeks satu.

Akses bendera

Dua bait pertama selepas kumpulan tetap, bendera akses, menunjukkan sama ada fail ini menentukan kelas atau antara muka, sama ada kelas atau antara muka itu umum atau abstrak, dan (jika itu kelas dan bukan antara muka) sama ada kelas adalah muktamad.

Kelas ini

Dua bait seterusnya, komponen kelas ini , adalah indeks ke dalam kumpulan kumpulan tetap. Pemalar yang disebut oleh kelas ini , stable_pool [this_class], mempunyai dua bahagian, tag satu-bait dan indeks nama dua-bait. Teg akan sama dengan CONSTANT_Class, nilai yang menunjukkan elemen ini mengandungi maklumat mengenai kelas atau antara muka. Constant_pool [name_index] adalah pemalar rentetan yang mengandungi nama kelas atau antara muka.

The kelas ini komponen menyediakan gambaran bagaimana kolam pemalar digunakan. Kelas ini sendiri hanyalah indeks ke kumpulan tetap. Apabila JVM mencari stable_pool [this_class], ia menemui elemen yang mengidentifikasi dirinya sebagai CONSTANT_Class dengan tagnya. JVM tahu elemen CONSTANT_Class selalu mempunyai indeks dua-bait ke kumpulan tetap, yang disebut indeks nama, mengikuti tag satu-bait mereka. Oleh itu, ia akan mencari const_pool [name_index] untuk mendapatkan rentetan yang mengandungi nama kelas atau antara muka.

Kelas super

Mengikuti komponen kelas ini adalah komponen kelas super , indeks dua bait lain ke kumpulan tetap. Constant_pool [super_class] adalah elemen CONSTANT_Class yang menunjukkan nama kelas super dari mana kelas ini turun.

Antara muka

Komponen antara muka dimulakan dengan kiraan dua-byte bilangan antara muka yang dilaksanakan oleh kelas (atau antara muka) yang ditentukan dalam fail. Berikut adalah susunan yang mengandungi satu indeks ke kumpulan tetap untuk setiap antara muka yang dilaksanakan oleh kelas. Setiap antara muka diwakili oleh elemen CONSTANT_Class dalam kumpulan tetap yang menunjukkan nama antara muka.

Padang

Komponen medan dimulakan dengan kiraan dua byte jumlah medan dalam kelas atau antara muka ini. Medan adalah contoh atau pemboleh ubah kelas dari kelas atau antara muka. Mengikuti kiraan adalah susunan struktur panjang berubah, satu untuk setiap bidang. Setiap struktur mendedahkan maklumat tentang satu bidang seperti nama, jenis medan, dan, jika itu adalah pemboleh ubah akhir, nilai tetapnya. Beberapa maklumat terkandung dalam struktur itu sendiri, dan beberapa isi terkandung di lokasi kolam tetap yang ditunjukkan oleh struktur.

Satu-satunya bidang yang muncul dalam senarai adalah bidang yang dinyatakan oleh kelas atau antara muka yang ditentukan dalam fail; tiada medan yang diwarisi dari kelas super atau antara muka super muncul dalam senarai.

Kaedah

Komponen kaedah dimulakan dengan kiraan dua byte jumlah kaedah di kelas atau antara muka. Kiraan ini hanya merangkumi kaedah yang ditentukan secara eksplisit oleh kelas ini, bukan kaedah yang boleh diwarisi dari kacamata super. Mengikuti kaedah kiraan adalah kaedah itu sendiri.

Struktur untuk setiap kaedah mengandungi beberapa maklumat mengenai kaedah tersebut, termasuk deskriptor kaedah (jenis pengembalian dan senarai argumennya), jumlah kata tumpukan yang diperlukan untuk pemboleh ubah tempatan kaedah, jumlah maksimum kata susun yang diperlukan untuk operan kaedah timbunan, jadual pengecualian yang tertangkap oleh kaedah, urutan bytecode, dan jadual nombor baris.

Atribut

Membesarkan belakang adalah atribut, yang memberikan informasi umum mengenai kelas atau antara muka tertentu yang ditentukan oleh fail. Bahagian atribut mempunyai kiraan dua byte dari jumlah atribut, diikuti oleh atribut itu sendiri. Sebagai contoh, satu atribut adalah atribut kod sumber; ia mendedahkan nama fail sumber dari mana fail kelas ini disusun. JVM secara diam-diam akan mengabaikan atribut yang tidak mereka kenali.

Dimuat: simulasi fail kelas yang mencapai tujuan JVMnya

Applet di bawah mensimulasikan JVM memuat fail kelas. Fail kelas yang dimuat dalam simulasi dihasilkan oleh penyusun javac yang diberi kod sumber Java berikut:

kelas Act {public static void doMathForever () {int i = 0; sementara (benar) {i + = 1; i * = 2; }}}

Coretan kod di atas berasal dari artikel bulan lalu mengenai JVM. Ini adalah kaedah doMathForever () yang sama yang dilaksanakan oleh applet EternalMath dari artikel bulan lalu. Saya memilih kod ini untuk memberikan contoh sebenar yang tidak terlalu rumit. Walaupun kodnya mungkin tidak begitu berguna di dunia nyata, kod itu disusun ke fail kelas sebenar, yang dimuat oleh simulasi di bawah.

Applet GettingLoaded membolehkan anda mendorong simulasi beban kelas satu langkah pada satu masa. Untuk setiap langkah, anda boleh membaca mengenai bait seterusnya yang akan dimakan dan ditafsirkan oleh JVM. Cukup tekan butang "Langkah" untuk menyebabkan JVM memakan bahagian seterusnya. Menekan "Kembali" akan membatalkan langkah sebelumnya, dan menekan "Reset" akan mengembalikan simulasi ke keadaan asalnya, yang membolehkan anda memulakannya dari awal.

JVM ditunjukkan di kiri bawah menggunakan aliran bait yang membentuk fail kelas Act.class. Byte ditunjukkan dalam hex streaming dari pelayan di kanan bawah. Byte bergerak dari kanan ke kiri, antara pelayan dan JVM, satu bahagian pada satu masa. Sebilangan bait yang akan dimakan oleh JVM pada tekan butang "Langkah" seterusnya ditunjukkan dengan warna merah. Bait yang diserlahkan ini dijelaskan di kawasan teks besar di atas JVM. Sebarang bait yang tinggal di luar bahagian seterusnya ditunjukkan dalam warna hitam.

Saya telah cuba menerangkan sepenuhnya setiap bait di kawasan teks. Oleh itu, terdapat banyak perincian di kawasan teks dan anda mungkin ingin meneliti semua langkah terlebih dahulu untuk mendapatkan idea umum, kemudian mencari kembali lebih banyak maklumat.

Selamat mengklik.

Anda memerlukan penyemak imbas berkemampuan Java untuk melihat applet ini.

Klik di sini untuk kod sumber GettingLoaded. Untuk menjalankan applet ini sendiri, anda juga memerlukan dua fail yang diambil oleh applet ini dari pelayan, fail ASCII yang mengandungi teks untuk setiap langkah dan fail Act.class itu sendiri. Klik di sini untuk kod sumber applet audio Flying Class Files.

EndNote: Cetak kecil: "The Java Kelas Fail Gaya Hidup" Perkara Copyright (c) 1996 Rang Undang-Undang Venners. Hak cipta terpelihara. Hak Cipta Applet "GettingLoaded" (c) 1996 Artima Software Company. Hak cipta terpelihara.

: END_ENDNOTE

Bill Venners adalah presiden Syarikat Perisian Artima. Melalui Artima, dia melakukan pengembangan dan perundingan perisian khusus.

Ketahui lebih lanjut mengenai topik ini

  • Spesifikasi Mesin Maya Java, perkataan rasmi dari Sun.

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

  • Ketika keluar, buku The Java Virtual Machine Specification , //www.aw.com/cp/lindholm-yellin.html, oleh Tim Lindholm dan Frank Yellin (ISBN 0-201-63452-X), bagian dari The Java Siri, //www.aw.com/cp/javaseries.html), dari Addison-Wesley, kemungkinan akan menjadi sumber JVM terbaik.
  • Draf bab 4 Spesifikasi Mesin Maya Java , yang menjelaskan format fail kelas dan pengesahan bytecode, dapat diambil dari JavaSoft.

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

Kisah ini, "Gaya hidup file kelas Java" awalnya diterbitkan oleh JavaWorld.