Memeriksa Bytecode dengan javap
Nyahhimpun fail class dengan javap -c untuk memahami cara binaan Java diterjemahkan kepada bytecode.
Memeriksa Bytecode dengan javap ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Mengapa Memeriksa Kod Bait?
Memahami kod bait mendedahkan cara JVM sebenarnya melaksanakan kod Java anda. Hal ini membantu menyahpepijat isu prestasi, memahami pengoptimuman pengkompil dan mengesahkan bahawa kod sintetik (lambda, kelas dalaman) berfungsi seperti yang dijangka.
Penggunaan Asas javap
javap ClassName memaparkan antara muka awam kelas tersebut (tandatangan kaedah, pengisytiharan medan). Perintah ini membaca fail .class daripada direktori semasa atau laluan kelas.
# Compile first:
javac User.java
# Display public API:
javap User
# Output:
# public class User {
# public java.lang.String getName();
# public int getAge();
# }Menyahhimpun Kod Bait dengan -c
javap -c User memaparkan set arahan JVM (kod operasi) bagi setiap kaedah. Paparan ini merupakan pandangan utama untuk memahami aliran pelaksanaan.
# javap -c User
# public java.lang.String getName();
# Code:
# 0: aload_0
# 1: getfield #2 // Field name:Ljava/lang/String;
# 4: areturnKeluaran Terperinci dengan -v
javap -v User menambah kumpulan pemalar, bendera capaian, saiz tindanan dan jadual pengecualian — penting untuk analisis mendalam dan penyahpepijatan ClassCastException.
# javap -v User
# Constant pool:
# #1 = Methodref #5.#22 // java/lang/Object."<init>":()V
# #2 = Fieldref #4.#23 // User.name:Ljava/lang/String;
# ...Arahan Kod Bait Lazim
Kenali kod operasi yang paling kerap digunakan: aload_0 (muatkan this), getfield, putfield, invokevirtual, invokespecial (pembina/peribadi), invokestatic, invokedynamic (lambda), return, areturn.
Lambda dan invokedynamic
Ungkapan lambda dikompil kepada arahan invokedynamic. Seruan pertama menggunakan LambdaMetafactory untuk menjana kelas; seruan seterusnya menggunakannya semula. javap -v memaparkan jadual kaedah bootstrap.
// Java:
list.forEach(s -> System.out.println(s));
// Compiles to invokedynamic — javap shows:
// invokedynamic #4,0 // InvokeDynamic #0:accept:()Ljava/util/function/Consumer;Pengoptimuman Penggabungan Rentetan
javac moden menggunakan invokedynamic untuk "Hello " + name dan bukannya StringBuilder. javap -v memaparkan kaedah bootstrap StringConcatFactory.
// Java 9+ string concat:
String s = "Hello " + name;
// Compiles to:
// invokedynamic #5,0 // InvokeDynamic #1:makeConcatWithConstantsMelihat Capaian Kelas Dalaman
Apabila kelas luar mengakses medan peribadi kelas dalaman (atau sebaliknya), pengkompil menjana kaedah sintetik access$000. javap -p (ahli peribadi) mendedahkannya.
# javap -p OuterClass
# static int access$000(OuterClass);
# -- synthetic bridge method generated by the compilerMengesahkan Kos Pembungkusan Automatik
Pembungkusan automatik dikompil kepada seruan Integer.valueOf() atau int.intValue(). Gunakan javap -c untuk mengesahkan bahawa pembungkusan berlaku dan menentukan sama ada primitif patut digunakan.
// Java:
List<Integer> list = new ArrayList<>();
list.add(42); // autoboxing
// Bytecode:
// bipush 42
// invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer;Membaca Cuba-Tangkap daripada Kod Bait
Pengendali pengecualian muncul sebagai entri dalam jadual pengecualian, yang boleh dilihat dengan javap -v. Setiap entri menunjukkan permulaan cuba, penghujung cuba, pengendali dan jenis yang ditangkap.
# Exception table:
# from to target type
# 2 10 15 Class java/io/IOException
# -- means: if IOException in bytes 2-10, jump to handler at byte 15Pengepala Fail Kelas
Pengepala fail kelas mengandungi nombor ajaib (CAFEBABE), versi utama/sekunder dan bendera capaian. javap -v memaparkan versi utama, yang sepadan dengan keluaran Java yang menyusun kelas tersebut.
# javap -v User
# minor version: 0
# major version: 61 <- Java 17
# flags: ACC_PUBLIC, ACC_SUPERSemakan Pantas
Bendera javap yang manakah memaparkan kod operasi JVM bagi setiap kaedah?
Rumusan
Gunakan javap -c untuk kod operasi dan javap -v untuk butiran penuh. Kenali kod operasi utama: invokevirtual, invokespecial, invokedynamic, getfield. Periksa lambda, pembungkusan dan penggabungan rentetan untuk memahami keluaran pengkompil.
Pelajari Java dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 104
- Pelajaran
- 374
Soalan Lazim
Adakah pelajaran “Memeriksa Bytecode dengan javap” percuma?
Ya — teks penuh “Memeriksa Bytecode dengan javap” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Memeriksa Bytecode dengan javap”?
Nyahhimpun fail class dengan javap -c untuk memahami cara binaan Java diterjemahkan kepada bytecode. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Java Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Memeriksa Bytecode dengan javap” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Fasa Pemuatan Kelas: Muat, Paut, Mulakan
- Hierarki ClassLoader dan Pemuat Tersuai
- Memeriksa Bytecode dengan javap
- Penyusunan JIT dan Penyusunan Berperingkat