Inspektera bytekod med javap
De-assemblera klassfiler med javap -c för att förstå hur Java-konstruktioner översätts till bytekod.
Inspektera bytekod med javap är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.
Varför inspektera bytekod
Att förstå bytekod visar hur JVM faktiskt kör Java-kod. Det hjälper vid felsökning av prestandaproblem, förståelse av kompilatoroptimeringar och verifiering av att syntetisk kod (lambdas, inre klasser) fungerar som förväntat.
Grundläggande användning av javap
javap ClassName visar klassens publika API (metodsignaturer, fältdeklarationer). Verktyget läser .class-filen från den aktuella katalogen eller classpath.
# Compile first:
javac User.java
# Display public API:
javap User
# Output:
# public class User {
# public java.lang.String getName();
# public int getAge();
# }Disassemblera bytekod med -c
javap -c User visar JVM:s instruktionsuppsättning (opkoder) för varje metod. Detta är den viktigaste vyn för att förstå körningsflödet.
# javap -c User
# public java.lang.String getName();
# Code:
# 0: aload_0
# 1: getfield #2 // Field name:Ljava/lang/String;
# 4: areturnUtförlig utdata med -v
javap -v User lägger till konstantpoolen, åtkomstflaggorna, stackstorlekarna och undantagstabellen – viktigt för djupgående analys och felsökning 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;
# ...Vanliga bytekodsinstruktioner
Känn till de vanligaste opkoderna: aload_0 (läs in this), getfield, putfield, invokevirtual, invokespecial (konstruktorer/privata metoder), invokestatic, invokedynamic (lambdas), return, areturn.
Lambdas och invokedynamic
Lambda-uttryck kompileras till instruktioner med invokedynamic. Det första anropet använder LambdaMetafactory för att generera en klass; efterföljande anrop återanvänder den. javap -v visar tabellen över 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;Optimering av strängkonkatenering
Moderna javac använder invokedynamic för "Hello " + name i stället för StringBuilder. javap -v visar bootstrap-metoden StringConcatFactory.
// Java 9+ string concat:
String s = "Hello " + name;
// Compiles to:
// invokedynamic #5,0 // InvokeDynamic #1:makeConcatWithConstantsObservera åtkomst till inre klasser
När en yttre klass får åtkomst till ett privat fält i en inre klass (eller tvärtom) genererar kompilatorn syntetiska metoder med namnet access$000. javap -p (privata medlemmar) visar dem.
# javap -p OuterClass
# static int access$000(OuterClass);
# -- synthetic bridge method generated by the compilerVerifiera kostnaden för autoboxning
Autoboxning kompileras till anrop av Integer.valueOf() eller int.intValue(). Använd javap -c för att bekräfta att boxing sker och avgöra om primitiva typer bör användas.
// Java:
List<Integer> list = new ArrayList<>();
list.add(42); // autoboxing
// Bytecode:
// bipush 42
// invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer;Avläsa try-catch från bytekod
Undantagshanterare visas som poster i undantagstabellen, synlig med javap -v. Varje post visar början och slutet på try-blocket, hanteraren och den infångade typen.
# 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 15Klassfilens header
Klassfilens header innehåller det magiska talet (CAFEBABE), huvud- och underversionen samt åtkomstflaggorna. javap -v visar huvudversionen, som motsvarar den Java-version som kompilerade klassen.
# javap -v User
# minor version: 0
# major version: 61 <- Java 17
# flags: ACC_PUBLIC, ACC_SUPERSnabbkontroll
Vilken javap-flagga visar JVM-opkoder för varje metod?
Sammanfattning
Använd javap -c för opkoder och javap -v för fullständig information. Känn till viktiga opkoder: invokevirtual, invokespecial, invokedynamic, getfield. Inspektera lambdas, boxing och strängkonkatenering för att förstå kompilatorns utdata.
Lär dig Java med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 104
- Lektioner
- 374
Vanliga frågor
Är lektionen ”Inspektera bytekod med javap” gratis?
Ja – hela texten till ”Inspektera bytekod med javap” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Inspektera bytekod med javap”?
De-assemblera klassfiler med javap -c för att förstå hur Java-konstruktioner översätts till bytekod. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Java Academy?
Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Inspektera bytekod med javap”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Java Academy-lektionen?
Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Faser vid klassinläsning: Load, Link, Initialize
- ClassLoader-hierarki och egna laddare
- Inspektera bytekod med javap
- JIT-kompilering och nivåindelad kompilering