Inspeksjon av bytekode med javap
Dekompiler klassefiler med javap -c for å forstå hvordan Java-konstruksjoner oversettes til bytekode.
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: areturnDetaljert 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:makeConcatWithConstantsSe 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 compilerKontrollere 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 15Klassefilhode
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_SUPERKort 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.
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
- Faser i klasselasting: last inn, lenk og initialiser
- ClassLoader-hierarki og egendefinerte innlastere
- Inspeksjon av bytekode med javap
- JIT-kompilering og nivåinndelt kompilering