a metódy v JVM
1. Prehľad
JVM používa dve charakteristické metódy na inicializáciu inštancií a tried objektov.
V tomto rýchlom článku sa pozrieme na to, ako kompilátor a runtime používajú a metódy na účely inicializácie.
2. Metódy inicializácie inštancie
Začnime s priamym priradením a priradením objektu:
Object obj = new Object ();
Ak tento úryvok zostavíme a pozrieme sa na jeho bytecode pomocou javap -c, uvidíme niečo ako:
0: new # 2 // class java / lang / Object 3: dup 4: invokespecial # 1 // Method java / lang / Object. "" :() V 7: astore_1
Inicializuje sa objekt, JVM volá špeciálnu metódu s názvom .V žargóne JVM je táto metóda metódou inicializácie inštancie. Metódou je inicializácia inštancie, len ak:
- Je definované v triede
- Volá sa to <init>
- Vracia sa to neplatný
Každá trieda môže mať nula alebo viac metód inicializácie inštancie. Tieto metódy zvyčajne zodpovedajú konštruktorom v programovacích jazykoch založených na JVM, ako sú Java alebo Kotlin.
2.1. Konštruktory a bloky inicializátora inštancie
Aby sme lepšie pochopili, ako prekladač Java prekladá konštruktory , zvážime ďalší príklad:
verejná trieda Osoba {private String firstName = "Foo"; // private String lastName = "Bar"; // // {System.out.println ("Inicializuje sa ..."); } // verejná osoba (reťazec meno, reťazec priezvisko) {this.firstName = meno; this.lastName = priezvisko; } // verejná osoba () {}}
Toto je bytecode pre túto triedu:
public Person (java.lang.String, java.lang.String); Kód: 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 / Reťazec; 10: aload_0 11: ldc # 15 // String Bar 13: putfield # 17 // Field lastName: Ljava / lang / String; 16: getstatic # 20 // Pole java / lang / System.out: Ljava / io / PrintStream; 19: ldc # 26 // Inicializácia reťazca ... 21: invokevirtual # 28 // Metóda java / io / PrintStream.println: (Ljava / lang / String;) V 24: aload_0 25: aload_1 26: putfield # 9 // Krstné meno poľa: Ljava / lang / String; 29: aload_0 30: aload_2 31: putfield # 17 // Priezvisko priezviska: Ljava / lang / String; 34: návrat
Aj keď sú bloky konštruktoru a inicializátora v Jave oddelené, na úrovni bytecode sú v rovnakom prípade inicializačnou metódou. V skutočnosti toto metóda:
- Najskôr sa inicializuje krstné meno a priezvisko polia (index 0 až 13)
- Potom niečo vytlačí na konzolu ako súčasť bloku inicializátora inštancií (index 16 až 21)
- A nakoniec aktualizuje premenné inštancie pomocou argumentov konštruktora
Ak vytvoríme a Osoba nasledovne:
Osoba osoba = nová osoba ("Brian", "Goetz");
Potom sa to premení na nasledujúci bajtkód:
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
Tentokrát JVM volá inú metóda s podpisom zodpovedajúcim konštruktoru Java.
Kľúčovým riešením je, že konštruktory a ďalšie inicializátory inštancií sú ekvivalentné s metóda vo svete JVM.
3. Metódy inicializácie triedy
V Jave sú statické inicializačné bloky užitočné, keď ideme inicializovať niečo na úrovni triedy:
verejná trieda Osoba {private static final Logger LOGGER = LoggerFactory.getLogger (Person.class); // // static {System.out.println ("Statická inicializácia ..."); } // vynechané}
Keď kompilujeme predchádzajúci kód, prekladač preloží statický blok na metódu inicializácie triedy na úrovni bytecode.
Zjednodušene povedané, metóda je inicializácia triedy, len ak:
- Volá sa to
- Vracia sa to neplatný
Jediným spôsobom, ako vygenerovať a metóda v Jave je použitie statických polí a inicializátorov statického bloku.
JVM sa odvoláva na prvýkrát použijeme zodpovedajúcu triedu. Preto vyvolanie sa deje za behu a nevidíme vyvolanie na úrovni bytecode.
4. Záver
V tomto rýchlom článku sme videli rozdiel medzi a metódy v JVM. The metóda sa používa na inicializáciu inštancií objektov. JVM sa takisto dovoláva metóda na inicializáciu triedy, kedykoľvek je to potrebné.
Aby ste lepšie pochopili, ako funguje inicializácia v JVM, dôrazne sa odporúča prečítať si špecifikáciu JVM.