Rumah  >  Artikel  >  Java  >  Cara membaca Java Bytecode untuk keseronokan dan keuntungan

Cara membaca Java Bytecode untuk keseronokan dan keuntungan

PHP中文网
PHP中文网asal
2024-10-22 13:03:131004semak imbas

Memulakan perjalanan melalui dunia Java Bytecode? Artikel ini merangkumi semua yang anda perlu ketahui untuk bermula.

Cara membaca Java Bytecode untuk keseronokan dan keuntungan

Apakah itu bytecode?

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.

Melihat Kod Bait

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

Membedah Bytecode

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`.

Memanfaatkan Analisis Bytecode

Saya telah nyatakan sebelum ini bahawa ini boleh membantu untuk kejuruteraan terbalik, pengoptimuman prestasi dan penyelidikan keselamatan. Mari kembangkan mereka sekarang.

Kejuruteraan Terbalik

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Melempar semula pengecualianArtikel seterusnya:Melempar semula pengecualian