Memulakan perjalanan melalui dunia Java Bytecode? Artikel ini merangkumi semua yang anda perlu ketahui untuk bermula.
Pada tahun 1995, Sun Microsystems, pencipta pengaturcaraan Java bahasa, membuat tuntutan yang berani. Mereka berkata bahawa Java akan membolehkan anda "menulis sekali dan berlari ke mana-mana sahaja." Ini bermakna binari yang disusun akan dapat dijalankan pada mana-mana seni bina sistem, sesuatu yang tidak dapat dilakukan oleh C dan kekal sebagai penyewa teras penulisan Java sehingga hari ini.
Untuk mencapai keupayaan merentas platform ini, Java menggunakan pendekatan yang unik semasa menyusun. Daripada pergi dari kod sumber terus ke kod mesin (yang akan khusus untuk setiap seni bina sistem), Java menyusun atur caranya ke dalam bentuk perantaraan yang dikenali sebagai kod bait. Bytecode ialah satu set arahan yang tidak terikat pada bahasa mesin tertentu atau bergantung pada mana-mana seni bina perkakasan tertentu. Abstraksi ini adalah kunci kepada kemudahalihan Java.
Atur cara yang mentafsir dan melaksanakan arahan kod bait Java dipanggil Mesin Maya Java (JVM). JVM menterjemahkan setiap arahan bytecode ke dalam kod mesin asli kepada seni bina sistem tertentu yang sedang dijalankan. Proses ini, sering dirujuk sebagai kompilasi "just-in-time" (JIT), membenarkan kod bait Java dilaksanakan secekap yang mungkin pada mana-mana platform tertentu.
Kod Bait bukan 'bukan hanya berguna untuk JVM, walaupun. Oleh kerana kod bait kelas Java berguna untuk kejuruteraan terbalik, pengoptimuman prestasi, penyelidikan keselamatan dan fungsi analisis statik lain, JDK dihantar dengan utiliti untuk membantu anda dan saya memeriksanya.
Untuk melihat contoh bytecode, pertimbangkan dua kaedah berikut daripada `java.lang.Boolean`, `booleanValue` dan `valueOf(boolean)` yang masing-masing menyahkotak dan kotak jenis primitif `boolean`:
public boolean booleanValue() { return value; } public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); }
Menggunakan ` arahan javap`, yang dihantar dengan JDK, kita boleh melihat kod bait untuk setiap satu. Anda boleh melakukan ini dengan menjalankan `javap` dengan arahan `-c` dan nama kelas yang layak sepenuhnya, seperti:
javap -c java.lang.Boolean
Terdapat kod bait untuk semua kaedah awam dalam ` java.lang.Boolean`. Di sini saya hanya menyalin bytecode untuk `booleanValue` dan `valueOf(boolean)`:
public boolean booleanValue(); code: 0: aload_0 1: getfield #7 // Field value:Z 4: ireturn public static java.lang.Boolean valueOf(boolean); Code: 0: iload_0 1: ifeq 10 4: getstatic #27 // Field TRUE:Ljava/lang/Boolean; 7: goto 13 10: getstatic #31 // Field FALSE:Ljava/lang/Boolean; 13: areturn
Pada pandangan pertama, ini adalah bahasa yang sama sekali baru untuk dipelajari. Walau bagaimanapun, ia menjadi mudah dengan cepat apabila anda mempelajari perkara yang dilakukan oleh setiap arahan dan Java beroperasi dengan timbunan.
Ambil tiga arahan kod bait untuk `booleanValue`, sebagai contoh:
`aload_n` bermaksud meletakkan rujukan kepada pembolehubah setempat pada tindanan. Dalam contoh kelas, `aload_0` merujuk kepada `ini`.
`getfield` bermaksud membaca pembolehubah ahli daripada `this` (item yang lebih rendah pada tindanan) dan meletakkannya nilai ke dalam tindanan
`#7` merujuk kepada indeks rujukan dalam kumpulan malar
`// Nilai medan:Z` memberitahu kami merujuk kepada apa yang `#7`, medan bernama `value` jenis `boolean` (Z)
`return` bermaksud untuk memaparkan nilai primitif daripada timbunan dan kembalikannya
Pendek cerita, ketiga-tiga arahan ini mencari medan `nilai` instance dan mengembalikannya.
Sebagai contoh kedua, ambil lihat kaedah seterusnya, `valueOf(boolean)`:
`iload_n` bermaksud meletakkan pembolehubah tempatan primitif pada tindanan. `iload_0` merujuk kepada parameter kaedah pertama (memandangkan parameter kaedah pertama adalah primitif)
`ifeq n` bermaksud keluarkan nilai daripada tindanan dan lihat sama ada ia benar; jika ya, teruskan ke baris seterusnya, jika tidak, lompat ke baris `n`
`getstatic #n` bermaksud membaca ahli statik pada tindanan
`#27` merujuk kepada indeks ahli statik dalam kumpulan malar
`// Medan BENAR:Ljava/lang/Boolean` memberitahu kita apa yang dirujuk oleh `#27` , ahli statik bernama `TRUE` jenis `Boolean
`goto n` bermakna sekarang lompat ke baris `n` dalam bytecode
`areturn` bermaksud mengeluarkan rujukan daripada timbunan dan mengembalikannya
Dalam erti kata lain, arahan ini mengatakan, ambil parameter kaedah pertama, jika ia benar , kemudian kembalikan `Boolean.TRUE`; jika tidak, kembalikan `Boolean.FALSE`.
Saya telah nyatakan sebelum ini bahawa ini boleh membantu untuk kejuruteraan terbalik, pengoptimuman prestasi dan penyelidikan keselamatan. Mari kembangkan mereka sekarang.
Apabila bekerja dengan perpustakaan pihak ketiga atau komponen sumber tertutup, analisis bytecode menjadi alat yang berkuasa. Menyahkompilasi kod bait boleh memberikan gambaran ke dalam kerja dalaman perpustakaan ini, membantu dalam penyepaduan, penyelesaian masalah dan memastikan keserasian.
Dalam situasi di mana anda menghadapi kod Java proprietari atau sumber tertutup, membaca kod bait boleh menjadi satu-satunya yang boleh dilaksanakan. cara untuk memahami fungsinya. Analisis Bytecode membolehkan anda membuat kejuruteraan terbalik dan memahami gelagat aplikasi sumber tertutup, memudahkan kesalingoperasian atau penyesuaian.
Dalam cara contoh kehidupan sebenar, saya baru-baru ini cuba menyepadukan alat analisis kusut pakej pihak ketiga ke dalam sistem Ci kami. Malangnya, vendor adalah sumber tertutup dan hanya mempunyai dokumentasi untuk cara mengakses perpustakaan melalui UI proprietari mereka. Dengan menganalisis kod bait, saya dapat merekayasa terbalik input dan output yang dijangkakan bagi enjin analitik asas.
Atas ialah kandungan terperinci Cara membaca Java Bytecode untuk keseronokan dan keuntungan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!