Tavukoodin tarkastelu javap-ohjelmalla
Purkaa luokkatiedostoja komennolla javap -c ymmärtääksesi, miten Javan rakenteet kääntyvät tavukoodiksi.
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: areturnYksityiskohtainen 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:makeConcatWithConstantsSisä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 compilerAutoboxauksen 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 15Luokkatiedoston 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_SUPERPikatarkistus
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.
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
- Luokkien latausvaiheet: Load, Link ja Initialize
- ClassLoader-hierarkia ja mukautetut lataajat
- Tavukoodin tarkastelu javap-ohjelmalla
- JIT-käännös ja tasokäännös