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.


$config[zx-auto] not found$config[zx-overlay] not found