i metode u JVM-u

1. Pregled

JVM koristi dvije karakteristične metode za inicijalizaciju instanci objekata i klasa.

U ovom brzom članku vidjet ćemo kako kompajler i vrijeme izvođenja koriste i metode u svrhu inicijalizacije.

2. Metode inicijalizacije instance

Počnimo s izravnom dodjelom i dodjelom objekata:

Objekt obj = novi objekt ();

Ako kompajliramo ovaj isječak i pogledamo njegov bytecode putem javap -c, vidjet ćemo nešto poput:

0: novo # 2 // klasa java / lang / Object 3: dup 4: invokespecial # 1 // Metoda java / lang / Object. "" :() V 7: astore_1

Za inicijalizaciju objekta, JVM poziva posebnu metodu imenovanu .U JVM žargonu, ova metoda je metoda inicijalizacije instance. Metoda je inicijalizacija instance ako i samo ako:

  • Definiran je u klasi
  • Zove se <init>
  • Vraća se poništiti

Svaka klasa može imati nula ili više metoda inicijalizacije instance. Te metode obično odgovaraju konstruktorima u programskim jezicima temeljenim na JVM-u, kao što su Java ili Kotlin.

2.1. Konstruktori i blokovi inicijalizatora instance

Da biste bolje razumjeli kako Java kompajler prevodi konstruktore u , razmotrimo još jedan primjer:

javna klasa Osoba {private String firstName = "Foo"; // privatni niz lastName = "Bar"; // // {System.out.println ("Inicijalizacija ..."); } // javna osoba (String firstName, String lastName) {this.firstName = firstName; this.lastName = lastName; } // javna osoba () {}}

Ovo je bytecode za ovu klasu:

javna Osoba (java.lang.String, java.lang.String); Šifra: 0: aload_0 1: invokespecial # 1 // Method java / lang / Object. "" :() V 4: aload_0 5: ldc # 7 // String Foo 7: putfield # 9 // FirstName polja: Ljava / lang /Niz; 10: aload_0 11: ldc # 15 // Traka niza 13: putfield # 17 // Polje lastName: Ljava / lang / String; 16: getstatic # 20 // Field java / lang / System.out: Ljava / io / PrintStream; 19: ldc # 26 // Inicijalizacija niza ... 21: invokevirtual # 28 // Metoda java / io / PrintStream.println: (Ljava / lang / String;) V 24: aload_0 25: aload_1 26: putfield # 9 // Ime prvog polja: Ljava / lang / String; 29: aload_0 30: aload_2 31: putfield # 17 // Polje lastName: Ljava / lang / String; 34: povratak

Iako su konstruktor i blokovi inicijalizatora odvojeni u Javi, nalaze se u istoj metodi inicijalizacije instance na razini bajtkoda. Zapravo, ovo metoda:

  • Prvo, inicijalizira ime i prezime polja (indeks 0 do 13)
  • Zatim nešto ispisuje na konzolu kao dio bloka inicijalizatora instance (indeks 16 do 21)
  • I na kraju, ažurira varijable instance s argumentima konstruktora

Ako stvorimo a Osoba kako slijedi:

Osoba osoba = nova osoba ("Brian", "Goetz");

Zatim se ovo prevodi u sljedeći bajtkod:

0: novi # 7 // razred Osoba 3: dup 4: ldc # 9 // Niz Brian 6: ldc # 11 // Niz Goetz 8: invokespecial # 13 // Metoda Osoba. "" :( Ljava / lang / String; Ljava / lang / String;) V 11: astore_1

Ovaj put JVM poziva drugog metoda s potpisom koji odgovara Java konstruktoru.

Ovdje je ključno da su konstruktori i drugi inicijalizatori instanci ekvivalentni metoda u JVM svijetu.

3. Metode inicijalizacije razreda

U Javi su statički blokovi inicijalizatora korisni kada ćemo nešto inicijalizirati na razini klase:

javna klasa Person {private static final Logger LOGGER = LoggerFactory.getLogger (Person.class); // // static {System.out.println ("Statička inicijalizacija ..."); } // izostavljeno}

Kada kompajliramo prethodni kod, kompajler prevodi statički blok u metodu inicijalizacije klase na razini bajt-koda.

Jednostavno rečeno, metoda je inicijalizacija klase ako i samo ako:

  • Zove se
  • Vraća se poništiti

Stoga je jedini način generiranja a metoda u Javi je korištenje statičkih polja i pokretača statičkih blokova.

JVM poziva prvi put koristimo odgovarajuću klasu. Stoga je prizivanje se događa u vrijeme izvođenja, a prizivanje ne možemo vidjeti na razini bajt-koda.

4. Zaključak

U ovom kratkom članku vidjeli smo razliku između i metode u JVM-u. The metoda koristi se za inicijalizaciju instanci objekata. Također, JVM poziva metoda za inicijalizaciju klase kad god je to potrebno.

Da biste bolje razumjeli kako inicijalizacija funkcionira u JVM-u, toplo se preporučuje pročitati JVM specifikaciju.