Java Academy · leksjon

Inspeksjon av bytekode med javap

Dekompiler klassefiler med javap -c for å forstå hvordan Java-konstruksjoner oversettes til bytekode.

Leksjon 3 av 413 trinn

Inspeksjon av bytekode med javap er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hvorfor inspisere bytekode

Forståelse av bytekode viser hvordan JVM-en faktisk kjører Java-koden din. Det hjelper deg med å feilsøke ytelsesproblemer, forstå kompilatoroptimaliseringer og kontrollere at syntetisk kode (lambdaer, indre klasser) fungerer som forventet.

Grunnleggende bruk av javap

javap ClassName viser klassens offentlige API (metodesignaturer og feltdeklarasjoner). Den leser .class-filen fra gjeldende katalog eller classpath.

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

Demontere bytekode med -c

javap -c User viser JVM-instruksjonssettet (opkodene) for hver metode. Dette er hovedvisningen for å forstå kjøringsflyten.

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

Detaljert utdata med -v

javap -v User legger til konstantpoolen, tilgangsflagg, stakkstørrelser og unntakstabellen – noe som er nødvendig for grundig analyse og feilsøking av ClassCastException.

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

Vanlige bytekodeinstruksjoner

Kjenn de vanligste opkodene: aload_0 (last inn this), getfield, putfield, invokevirtual, invokespecial (konstruktører/private), invokestatic, invokedynamic (lambdaer), return, areturn.

Lambdaer og invokedynamic

Lambda-uttrykk kompileres til invokedynamic-instruksjoner. Det første kallet bruker LambdaMetafactory til å generere en klasse. Senere kall gjenbruker den. javap -v viser tabellen over bootstrap-metoder.

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

Optimalisering av strengsammenslåing

Moderne javac bruker invokedynamic for "Hello " + name i stedet for StringBuilder. javap -v viser bootstrap-metoden StringConcatFactory.

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

Se tilgang fra indre klasser

Når en ytre klasse aksesserer et privat felt i en indre klasse (eller omvendt), genererer kompilatoren syntetiske access$000-metoder. javap -p (private medlemmer) viser dem.

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

Kontrollere kostnaden ved autoboxing

Autoboxing kompileres til kall på Integer.valueOf() eller int.intValue(). Bruk javap -c for å bekrefte at boxing skjer, og avgjør om du bør bruke primitive typer.

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

Lese try-catch fra bytekode

Unntakshåndterere vises som oppføringer i unntakstabellen, som du kan se med javap -v. Hver oppføring viser starten og slutten på try-blokken, håndtereren og typen som fanges opp.

# 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

Klassefilhode

Klassefilhodet inneholder magisk nummer (CAFEBABE), hoved-/underversjon og tilgangsflagg. javap -v viser hovedversjonen, som angir hvilken Java-versjon som kompilerte klassen.

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

Kort kontroll

Hvilket javap-flagg viser JVM-opkodene for hver metode?

Oppsummering

Bruk javap -c for opkoder og javap -v for alle detaljer. Kjenn til viktige opkoder: invokevirtual, invokespecial, invokedynamic, getfield. Inspiser lambdaer, boxing og strengsammenslåing for å forstå kompilatorens utdata.

Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Inspeksjon av bytekode med javap» gratis?

Ja – hele teksten i «Inspeksjon av bytekode med javap» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Inspeksjon av bytekode med javap»?

Dekompiler klassefiler med javap -c for å forstå hvordan Java-konstruksjoner oversettes til bytekode. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Inspeksjon av bytekode med javap»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Faser i klasselasting: last inn, lenk og initialiser
  2. ClassLoader-hierarki og egendefinerte innlastere
  3. Inspeksjon av bytekode med javap
  4. JIT-kompilering og nivåinndelt kompilering
← Tilbake til Java Academy