Java Academy · Pelajaran

Memeriksa Bytecode dengan javap

Nyahhimpun fail class dengan javap -c untuk memahami cara binaan Java diterjemahkan kepada bytecode.

Pelajaran 3 daripada 413 langkah

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: areturn

Keluaran 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:makeConcatWithConstants

Melihat 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 compiler

Mengesahkan 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 15

Pengepala 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_SUPER

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

Percuma untuk bermula

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

  1. Fasa Pemuatan Kelas: Muat, Paut, Mulakan
  2. Hierarki ClassLoader dan Pemuat Tersuai
  3. Memeriksa Bytecode dengan javap
  4. Penyusunan JIT dan Penyusunan Berperingkat
← Kembali ke Java Academy