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.