Gaya hidup file kelas Java

Selamat datang di angsuran lain "Di Balik Terpal". Dalam artikel bulan lalu saya membahas Java Virtual Machine, atau JVM, komputer abstrak tempat semua program Java dikompilasi. Jika Anda tidak terbiasa dengan JVM, Anda mungkin ingin membaca artikel bulan lalu sebelum yang ini. Pada artikel ini saya memberikan sekilas tentang struktur dasar dan gaya hidup file kelas Java.

Terlahir untuk bepergian

File kelas Java adalah format yang ditentukan secara tepat untuk Java yang dikompilasi. Kode sumber Java dikompilasi menjadi file kelas yang dapat dimuat dan dijalankan oleh JVM apa pun. File kelas dapat berjalan melintasi jaringan sebelum dimuat oleh JVM.

Faktanya, jika Anda membaca artikel ini melalui browser yang mendukung Java, file kelas untuk applet simulasi di akhir artikel sedang terbang melintasi Internet ke komputer Anda sekarang. Jika Anda ingin mendengarkannya (dan komputer Anda memiliki kemampuan audio), tekan tombol berikut:

Anda memerlukan browser yang mendukung Java untuk melihat applet ini

Kedengarannya mereka sedang bersenang-senang, ya? Itu sifat mereka. File kelas Java dirancang untuk berjalan dengan baik. Mereka tidak bergantung pada platform, jadi mereka akan diterima di lebih banyak tempat. Mereka berisi bytecode, set instruksi kompak untuk JVM, sehingga mereka dapat melakukan perjalanan ringan. File kelas Java terus-menerus melewati jaringan dengan kecepatan sangat tinggi untuk sampai ke JVM di seluruh dunia.

Apa isi file kelas?

File kelas Java berisi semua yang perlu diketahui JVM tentang satu kelas atau antarmuka Java. Dalam urutan kemunculannya di file kelas, komponen utamanya adalah: sihir, versi, kumpulan konstan, tanda akses, kelas ini, kelas super, antarmuka, bidang, metode, dan atribut.

Informasi yang disimpan dalam file kelas seringkali berbeda-beda panjangnya - yaitu, panjang sebenarnya informasi tidak dapat diprediksi sebelum memuat file kelas. Misalnya, jumlah metode yang tercantum dalam komponen metode dapat berbeda di antara file kelas, karena bergantung pada jumlah metode yang ditentukan dalam kode sumber. Informasi tersebut diatur dalam file kelas dengan mendahului informasi aktual berdasarkan ukuran atau panjangnya. Dengan cara ini, ketika kelas sedang dimuat oleh JVM, ukuran informasi panjang variabel dibaca terlebih dahulu. Setelah JVM mengetahui ukurannya, JVM dapat membaca informasi sebenarnya dengan benar.

Informasi umumnya ditulis ke file kelas tanpa spasi atau padding di antara bagian informasi yang berurutan; semuanya selaras pada batas byte. Ini membantu menjaga file kelas tetap kecil sehingga akan menjadi aerodinamis saat terbang melintasi jaringan.

Urutan komponen file kelas ditentukan secara ketat sehingga JVM dapat mengetahui apa yang diharapkan, dan di mana harus mengharapkannya, saat memuat file kelas. Misalnya, setiap JVM mengetahui bahwa delapan byte pertama dari file kelas berisi magic dan nomor versi, bahwa kumpulan konstan dimulai pada byte kesembilan, dan bahwa tanda akses mengikuti kumpulan konstan. Tetapi karena kumpulan konstan adalah variabel-panjang, ia tidak mengetahui keberadaan pasti dari flag akses sampai selesai membaca di kumpulan konstan. Setelah selesai membaca di kumpulan konstan, ia tahu bahwa dua byte berikutnya adalah flag akses.

Nomor sihir dan versi

Empat byte pertama dari setiap file kelas selalu 0xCAFEBABE. Angka ajaib ini membuat file kelas Java lebih mudah diidentifikasi, karena kemungkinan kecil bahwa file non-kelas akan dimulai dengan empat byte awal yang sama. Nomor tersebut disebut ajaib karena dapat ditarik keluar dari topi oleh desainer format file. Satu-satunya persyaratan adalah bahwa itu belum digunakan oleh format file lain yang mungkin ditemui di dunia nyata. Menurut Patrick Naughton, salah satu anggota kunci tim Java asli, angka ajaib itu dipilih "jauh sebelum nama Java pernah diucapkan sehubungan dengan bahasa ini. Kami mencari sesuatu yang menyenangkan, unik, dan mudah diingat. hanya kebetulan bahwa OxCAFEBABE, sebutan miring ke barista manis di Peet's Coffee, memberi pertanda untuk nama Jawa. "

Empat byte kedua dari file kelas berisi nomor versi mayor dan minor. Angka-angka ini mengidentifikasi versi format file kelas yang dipatuhi oleh file kelas tertentu dan memungkinkan JVM untuk memverifikasi bahwa file kelas dapat dimuat. Setiap JVM memiliki versi maksimum yang dapat dimuatnya, dan JVM akan menolak file kelas dengan versi yang lebih baru.

Kolam konstan

File kelas menyimpan konstanta yang terkait dengan kelas atau antarmukanya di kumpulan konstan. Beberapa konstanta yang mungkin terlihat bermain-main di pool adalah string literal, nilai variabel akhir, nama kelas, nama antarmuka, nama dan tipe variabel, dan nama metode dan tanda tangan. Tanda tangan metode adalah tipe kembaliannya dan kumpulan tipe argumen.

Kumpulan konstan diatur sebagai larik elemen dengan panjang variabel. Setiap konstanta menempati satu elemen dalam array. Di seluruh file kelas, konstanta dirujuk oleh indeks integer yang menunjukkan posisinya dalam array. Konstanta awal memiliki indeks satu, konstanta kedua memiliki indeks dua, dll. Larik kumpulan konstanta didahului oleh ukuran lariknya, sehingga JVM akan mengetahui berapa banyak konstanta yang diharapkan saat memuat file kelas.

Setiap elemen kumpulan konstanta dimulai dengan tag satu byte yang menentukan jenis konstanta pada posisi itu dalam larik. Setelah JVM mengambil dan menafsirkan tag ini, JVM mengetahui apa yang mengikuti tag tersebut. Misalnya, jika tag menunjukkan konstanta adalah string, JVM mengharapkan dua byte berikutnya menjadi panjang string. Setelah panjang dua byte ini, JVM mengharapkan untuk menemukan jumlah panjang byte, yang menyusun karakter string.

Di sisa artikel ini saya terkadang akan merujuk ke elemen ke-n dari array kumpulan konstan sebagai constant_pool [n]. Ini masuk akal jika kumpulan konstan diatur seperti larik, tetapi perlu diingat bahwa elemen ini memiliki ukuran dan jenis yang berbeda dan bahwa elemen pertama memiliki indeks satu.

Bendera akses

Dua byte pertama setelah kumpulan konstan, tanda akses, menunjukkan apakah file ini mendefinisikan kelas atau antarmuka, apakah kelas atau antarmuka itu publik atau abstrak, dan (jika itu kelas dan bukan antarmuka) apakah kelas sudah final.

Kelas ini

Dua byte berikutnya, komponen kelas ini , adalah indeks ke dalam array kumpulan konstan. Konstanta yang dirujuk oleh kelas ini , constant_pool [kelas_ini], memiliki dua bagian, tag satu byte dan indeks nama dua byte. Tag akan sama dengan CONSTANT_Class, nilai yang menunjukkan elemen ini berisi informasi tentang kelas atau antarmuka. Constant_pool [name_index] adalah konstanta string yang berisi nama kelas atau antarmuka.

The kelas ini komponen memberikan sekilas tentang bagaimana kolam konstan digunakan. Kelas ini sendiri hanyalah indeks ke kumpulan konstan. Saat JVM mencari constant_pool [kelas_ini], ia menemukan elemen yang mengidentifikasi dirinya sebagai CONSTANT_Class dengan tagnya. JVM mengetahui elemen CONSTANT_Class selalu memiliki indeks dua byte ke dalam kumpulan konstan, yang disebut indeks nama, mengikuti tag satu byte mereka. Jadi ia mencari constant_pool [name_index] untuk mendapatkan string yang berisi nama kelas atau antarmuka.

Kelas super

Mengikuti komponen kelas ini adalah komponen kelas super , indeks dua byte lainnya ke dalam kumpulan konstan. Constant_pool [super_class] adalah elemen CONSTANT_Class yang menunjuk ke nama kelas super tempat kelas ini diturunkan.

Antarmuka

Komponen antarmuka dimulai dengan hitungan dua byte dari jumlah antarmuka yang diimplementasikan oleh kelas (atau antarmuka) yang ditentukan dalam file. Berikut ini adalah larik yang berisi satu indeks ke dalam kumpulan konstan untuk setiap antarmuka yang diimplementasikan oleh kelas. Setiap antarmuka diwakili oleh elemen CONSTANT_Class di kumpulan konstan yang menunjuk ke nama antarmuka.

Fields

Komponen bidang dimulai dengan hitungan dua byte dari jumlah bidang di kelas atau antarmuka ini. Bidang adalah contoh atau variabel kelas dari kelas atau antarmuka. Mengikuti hitungan adalah larik struktur dengan panjang variabel, satu untuk setiap bidang. Setiap struktur mengungkapkan informasi tentang satu bidang seperti nama bidang, jenis, dan, jika itu adalah variabel terakhir, nilai konstantanya. Beberapa informasi terdapat dalam struktur itu sendiri, dan beberapa terdapat di lokasi kumpulan konstan yang ditunjukkan oleh struktur.

Bidang yang muncul dalam daftar hanya yang dideklarasikan oleh kelas atau antarmuka yang ditentukan dalam file; tidak ada bidang yang diwarisi dari kelas super atau antarmuka super yang muncul dalam daftar.

Metode

Komponen metode dimulai dengan hitungan dua byte dari jumlah metode di kelas atau antarmuka. Hitungan ini hanya mencakup metode yang secara eksplisit ditentukan oleh kelas ini, bukan metode apa pun yang mungkin diwarisi dari superclass. Mengikuti metode hitungan adalah metode itu sendiri.

Struktur untuk setiap metode berisi beberapa informasi tentang metode, termasuk deskriptor metode (tipe kembalian dan daftar argumennya), jumlah kata tumpukan yang diperlukan untuk variabel lokal metode, jumlah maksimum kata tumpukan yang diperlukan untuk operand metode stack, tabel pengecualian yang ditangkap oleh metode, urutan bytecode, dan tabel nomor baris.

Atribut

Di bagian belakang terdapat atribut, yang memberikan informasi umum tentang kelas atau antarmuka tertentu yang ditentukan oleh file. Bagian atribut memiliki hitungan dua byte dari jumlah atribut, diikuti oleh atribut itu sendiri. Misalnya, satu atribut adalah atribut kode sumber; itu mengungkapkan nama file sumber dari mana file kelas ini dikompilasi. JVM akan mengabaikan atribut apa pun yang tidak mereka kenali secara diam-diam.

Sedang dimuat: simulasi file kelas yang mencapai tujuan JVM-nya

Applet di bawah ini mensimulasikan JVM yang memuat file kelas. File kelas yang dimuat dalam simulasi dihasilkan oleh kompiler javac yang diberi kode sumber Java berikut:

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

Potongan kode di atas berasal dari artikel bulan lalu tentang JVM. Ini adalah metode doMathForever () yang sama yang dijalankan oleh applet EternalMath dari artikel bulan lalu. Saya memilih kode ini untuk memberikan contoh nyata yang tidak terlalu rumit. Meskipun kode tersebut mungkin tidak terlalu berguna di dunia nyata, kode tersebut dapat dikompilasi ke file kelas nyata, yang dimuat oleh simulasi di bawah ini.

Applet GettingLoaded memungkinkan Anda untuk menjalankan simulasi beban kelas selangkah demi selangkah. Untuk setiap langkah di sepanjang jalan, Anda dapat membaca tentang potongan byte berikutnya yang akan dikonsumsi dan ditafsirkan oleh JVM. Cukup tekan tombol "Langkah" agar JVM menggunakan bagian berikutnya. Menekan "Kembali" akan membatalkan langkah sebelumnya, dan menekan "Reset" akan mengembalikan simulasi ke keadaan semula, memungkinkan Anda untuk memulai kembali dari awal.

JVM ditampilkan di kiri bawah mengkonsumsi aliran byte yang membentuk file kelas Act.class. Byte ditampilkan dalam hex yang mengalir keluar dari server di kanan bawah. Byte berjalan dari kanan ke kiri, antara server dan JVM, satu bagian dalam satu waktu. Potongan byte yang akan dikonsumsi oleh JVM pada penekanan tombol "Langkah" berikutnya ditampilkan dengan warna merah. Byte yang disorot ini dijelaskan di area teks besar di atas JVM. Setiap byte yang tersisa di luar potongan berikutnya ditampilkan dalam warna hitam.

Saya telah mencoba menjelaskan sepenuhnya setiap potongan byte di area teks. Ada banyak detail, oleh karena itu, di area teks dan Anda mungkin ingin membaca semua langkah terlebih dahulu untuk mendapatkan gambaran umum, kemudian melihat kembali untuk detail selengkapnya.

Selamat mengklik.

Anda memerlukan browser yang mendukung Java untuk melihat applet ini.

Klik di sini untuk kode sumber GettingLoaded. Untuk menjalankan applet ini sendiri, Anda juga memerlukan dua file yang diambil applet ini dari server, file ASCII yang berisi teks untuk setiap langkah dan file Act.class itu sendiri. Klik di sini untuk kode sumber applet audio Flying Class Files.

CATATAN AKHIR: Tulisan kecil: Artikel "Gaya Hidup File Kelas Java" Hak Cipta (c) 1996 Bill Venners. Seluruh hak cipta. Applet "GettingLoaded" Hak Cipta (c) 1996 Artima Software Company. Seluruh hak cipta.

: END_ENDNOTE

Bill Venners adalah presiden dari Artima Software Company. Melalui Artima, dia melakukan pengembangan dan konsultasi perangkat lunak khusus.

Pelajari lebih lanjut tentang topik ini

  • Spesifikasi Mesin Virtual Java, kata resmi 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 Seri, //www.aw.com/cp/javaseries.html), dari Addison-Wesley, kemungkinan besar akan menjadi sumber daya JVM terbaik.
  • Draf bab 4 dari Spesifikasi Mesin Virtual Java , yang menjelaskan format file kelas dan verifier bytecode, dapat diambil dari JavaSoft.

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

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