Java Academy · Oppitunti

Tavukoodin tarkastelu javap-ohjelmalla

Purkaa luokkatiedostoja komennolla javap -c ymmärtääksesi, miten Javan rakenteet kääntyvät tavukoodiksi.

Oppitunti 3/413 vaihetta

Tavukoodin tarkastelu javap-ohjelmalla on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Miksi tavukoodia kannattaa tarkastella

Tavukoodin ymmärtäminen paljastaa, miten JVM tosiasiassa suorittaa Java-koodia. Se auttaa suorituskykyongelmien vianmäärityksessä, kääntäjän optimointien ymmärtämisessä ja sen varmistamisessa, että synteettinen koodi (lambdat, sisäluokat) toimii odotetulla tavalla.

javap:n perusteet

javap ClassName näyttää luokan julkisen rajapinnan (metodien allekirjoitukset, kenttien määritykset). Se lukee .class-tiedoston nykyisestä hakemistosta tai classpathista.

# Compile first:
javac User.java
# Display public API:
javap User
# Output:
# public class User {
#   public java.lang.String getName();
#   public int getAge();
# }

Tavukoodin purkaminen -c-valitsimella

javap -c User näyttää kunkin metodin JVM-käskykannan (opkoodit). Tämä on keskeinen näkymä suorituksen kulun ymmärtämiseen.

# javap -c User
# public java.lang.String getName();
#   Code:
#      0: aload_0
#      1: getfield      #2  // Field name:Ljava/lang/String;
#      4: areturn

Yksityiskohtainen tuloste -v-valitsimella

javap -v User lisää tulosteeseen vakiopoolin, käyttöoikeusliput, pinokoot ja poikkeustaulukon – nämä ovat olennaisia syväanalyysissä ja ClassCastExceptionin vianmäärityksessä.

# javap -v User
# Constant pool:
#    #1 = Methodref  #5.#22  // java/lang/Object."<init>":()V
#    #2 = Fieldref   #4.#23  // User.name:Ljava/lang/String;
# ...

Yleiset tavukoodikäskyt

Tunne yleisimmät opkoodit: aload_0 (lataa this), getfield, putfield, invokevirtual, invokespecial (konstruktorit/yksityiset metodit), invokestatic, invokedynamic (lambdat), return, areturn.

Lambdat ja invokedynamic

Lambda-lausekkeet käännetään invokedynamic-käskyiksi. Ensimmäinen kutsu käyttää LambdaMetafactory-luokkaa luokan luomiseen; myöhemmät kutsut käyttävät sitä uudelleen. javap -v näyttää bootstrap-metoditaulukon.

// Java:
list.forEach(s -> System.out.println(s));
// Compiles to invokedynamic — javap shows:
// invokedynamic #4,0  // InvokeDynamic #0:accept:()Ljava/util/function/Consumer;

Merkkijonojen yhdistämisen optimointi

Moderni javac käyttää invokedynamic-käskyä ilmauksen "Hello " + name yhteydessä StringBuilder-luokan sijaan. javap -v näyttää StringConcatFactory-luokan bootstrap-metodin.

// Java 9+ string concat:
String s = "Hello " + name;
// Compiles to:
// invokedynamic #5,0  // InvokeDynamic #1:makeConcatWithConstants

Sisäluokan käytön tarkasteleminen

Kun ulompi luokka käyttää sisäluokan yksityistä kenttää (tai päinvastoin), kääntäjä luo synteettisiä access$000-metodeja. javap -p (yksityiset jäsenet) paljastaa ne.

# javap -p OuterClass
# static int access$000(OuterClass);
# -- synthetic bridge method generated by the compiler

Autoboxauksen kustannusten tarkistaminen

Autoboxaus käännetään Integer.valueOf()- tai int.intValue()-kutsuiksi. Vahvista javap -c-komennolla, että boxing tapahtuu, ja päätä, kannattaako käyttää primitiivityyppejä.

// Java:
List<Integer> list = new ArrayList<>();
list.add(42); // autoboxing
// Bytecode:
// bipush 42
// invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

Try-catch-rakenteen lukeminen tavukoodista

Poikkeuskäsittelijät näkyvät poikkeustaulukon merkintöinä, jotka voi nähdä komennolla javap -v. Kukin merkintä näyttää try-lohkon alun ja lopun, käsittelijän sekä siepatun tyypin.

# Exception table:
# from    to  target  type
#    2    10      15  Class java/io/IOException
# -- means: if IOException in bytes 2-10, jump to handler at byte 15

Luokkatiedoston otsake

Luokkatiedoston otsake sisältää taikanumeron (CAFEBABE), pää- ja sivuversion sekä käyttöoikeusliput. javap -v näyttää pääversion, josta selviää, mihin Java-julkaisuun luokan käännös perustuu.

# javap -v User
# minor version: 0
# major version: 61   <- Java 17
# flags: ACC_PUBLIC, ACC_SUPER

Pikatarkistus

Mikä javap-valitsin näyttää JVM-opkoodit jokaiselle metodille?

Kertaus

Käytä javap -c-komentoa opkoodeihin ja javap -v-komentoa kaikkiin yksityiskohtiin. Tunne keskeiset opkoodit: invokevirtual, invokespecial, invokedynamic, getfield. Tarkastele lambdoja, boxingia ja merkkijonojen yhdistämistä ymmärtääksesi kääntäjän tuottaman koodin.

Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Tavukoodin tarkastelu javap-ohjelmalla” ilmainen?

Kyllä – oppitunnin ”Tavukoodin tarkastelu javap-ohjelmalla” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Tavukoodin tarkastelu javap-ohjelmalla”?

Purkaa luokkatiedostoja komennolla javap -c ymmärtääksesi, miten Javan rakenteet kääntyvät tavukoodiksi. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Tavukoodin tarkastelu javap-ohjelmalla”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Luokkien latausvaiheet: Load, Link ja Initialize
  2. ClassLoader-hierarkia ja mukautetut lataajat
  3. Tavukoodin tarkastelu javap-ohjelmalla
  4. JIT-käännös ja tasokäännös
← Takaisin: Java Academy