dan Metode di JVM

1. Ikhtisar

JVM menggunakan dua metode berbeda untuk menginisialisasi instance dan kelas objek.

Dalam artikel singkat ini, kita akan melihat bagaimana compiler dan runtime menggunakan file dan metode untuk tujuan inisialisasi.

2. Metode Inisialisasi Instance

Mari kita mulai dengan alokasi dan tugas objek langsung:

Object obj = new Object();

Jika kita mengkompilasi cuplikan ini dan melihat bytecode-nya melalui javap -c , kita akan melihat sesuatu seperti:

0: new #2 // class java/lang/Object 3: dup 4: invokespecial #1 // Method java/lang/Object."":()V 7: astore_1

Untuk menginisialisasi objek , JVM memanggil metode khusus bernama .Dalam jargon JVM, metode ini adalah metode inisialisasi instance . Metode adalah inisialisasi instance jika dan hanya jika:

  • Ini didefinisikan di dalam kelas
  • Namanya < init>
  • Itu mengembalikan kekosongan

Setiap kelas dapat memiliki nol atau lebih metode inisialisasi instance . Metode ini biasanya sesuai dengan konstruktor dalam bahasa pemrograman berbasis JVM seperti Java atau Kotlin.

2.1. Pembangun dan Blok Penginisialisasi Instance

Untuk lebih memahami bagaimana compiler Java menerjemahkan konstruktor , mari pertimbangkan contoh lain:

public class Person { private String firstName = "Foo"; //  private String lastName = "Bar"; //  //  { System.out.println("Initializing..."); } //  public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } //  public Person() { } }

Ini adalah bytecode untuk kelas ini:

public Person(java.lang.String, java.lang.String); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."":()V 4: aload_0 5: ldc #7 // String Foo 7: putfield #9 // Field firstName:Ljava/lang/String; 10: aload_0 11: ldc #15 // String Bar 13: putfield #17 // Field lastName:Ljava/lang/String; 16: getstatic #20 // Field java/lang/System.out:Ljava/io/PrintStream; 19: ldc #26 // String Initializing... 21: invokevirtual #28 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 24: aload_0 25: aload_1 26: putfield #9 // Field firstName:Ljava/lang/String; 29: aload_0 30: aload_2 31: putfield #17 // Field lastName:Ljava/lang/String; 34: return

Meskipun konstruktor dan blok penginisialisasi terpisah di Java, mereka berada dalam metode inisialisasi instance yang sama di tingkat bytecode. Faktanya, inimetode:

  • Pertama, menginisialisasi bidang firstName dan lastName (indeks 0 hingga 13)
  • Kemudian, ia mencetak sesuatu ke konsol sebagai bagian dari blok penginisialisasi instance (indeks 16 hingga 21)
  • Dan terakhir, itu memperbarui variabel instan dengan argumen konstruktor

Jika kita membuat Orang sebagai berikut:

Person person = new Person("Brian", "Goetz");

Kemudian ini diterjemahkan menjadi bytecode berikut:

0: new #7 // class Person 3: dup 4: ldc #9 // String Brian 6: ldc #11 // String Goetz 8: invokespecial #13 // Method Person."":(Ljava/lang/String;Ljava/lang/String;)V 11: astore_1

Kali ini JVM memanggil yang lain metode dengan tanda tangan yang sesuai dengan konstruktor Java.

Kuncinya di sini adalah bahwa konstruktor dan penginisialisasi instance lainnya setara dengan metode di dunia JVM.

3. Metode Inisialisasi Kelas

Di Java, blok penginisialisasi statis berguna saat kita akan menginisialisasi sesuatu di tingkat kelas:

public class Person { private static final Logger LOGGER = LoggerFactory.getLogger(Person.class); //  //  static { System.out.println("Static Initializing..."); } // omitted }

Ketika kita mengkompilasi kode sebelumnya, kompilator menerjemahkan blok statis menjadi metode inisialisasi kelas pada level bytecode.

Sederhananya, metode adalah inisialisasi kelas jika dan hanya jika:

  • Namanya adalah
  • Itu mengembalikan kekosongan

Oleh karena itu, satu-satunya cara untuk menghasilkan file Metode di Java adalah dengan menggunakan bidang statis dan penginisialisasi blok statis.

JVM memanggil pertama kali kami menggunakan kelas yang sesuai. Oleh karena itu,pemanggilan terjadi pada waktu proses, dan kita tidak dapat melihat pemanggilan di tingkat bytecode.

4. Kesimpulan

Dalam artikel singkat ini, kami melihat perbedaan antara dan metode di JVM. Itumetode digunakan untuk menginisialisasi instance objek. Juga, JVM memanggilmetode untuk menginisialisasi kelas kapan pun diperlukan.

Untuk lebih memahami cara kerja inisialisasi di JVM, sangat disarankan untuk membaca spesifikasi JVM.