0Pricing
Java Academy · Leçon

Inspecter le bytecode avec javap

Décompilez des fichiers de classe avec javap -c afin de comprendre comment les constructions Java sont traduites en bytecode.

Inspecter le bytecode avec javap est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.

Pourquoi inspecter le bytecode ?

Comprendre le bytecode révèle comment la JVM exécute réellement votre code Java. Cela aide à déboguer les problèmes de performances, à comprendre les optimisations du compilateur et à vérifier que le code synthétique (lambdas, classes internes) fonctionne comme prévu.

Utilisation de base de javap

javap ClassName affiche l'API publique de la classe (signatures des méthodes, déclarations de champs). Il lit le fichier .class depuis le répertoire courant ou le chemin de classes.

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

Désassembler le bytecode avec -c

javap -c User affiche le jeu d'instructions de la JVM (codes opérationnels) pour chaque méthode. C'est la vue principale pour comprendre le flux d'exécution.

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

Sortie détaillée avec -v

javap -v User ajoute le pool de constantes, les indicateurs d'accès, les tailles de pile et la table des exceptions — des éléments essentiels pour une analyse approfondie et le débogage de ClassCastException.

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

Instructions courantes du bytecode

Retenez les codes opérationnels les plus fréquents : aload_0 (charger this), getfield, putfield, invokevirtual, invokespecial (constructeurs/méthodes privées), invokestatic, invokedynamic (lambdas), return, areturn.

Lambdas et invokedynamic

Les expressions lambda sont compilées en instructions invokedynamic. Le premier appel utilise LambdaMetafactory pour générer une classe ; les appels suivants la réutilisent. javap -v affiche la table des méthodes d'amorçage.

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

Optimisation de la concaténation de chaînes

Les versions modernes de javac utilisent invokedynamic pour "Hello " + name au lieu de StringBuilder. javap -v affiche la méthode d'amorçage StringConcatFactory.

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

Observer l'accès aux classes internes

Lorsqu'une classe externe accède à un champ privé d'une classe interne (ou inversement), le compilateur génère des méthodes synthétiques access$000. javap -p (membres privés) les révèle.

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

Vérifier le coût de la conversion automatique en objet

La conversion automatique en objet est compilée en appels à Integer.valueOf() ou int.intValue(). Utilisez javap -c pour confirmer qu'une conversion a lieu et décider s'il vaut mieux utiliser des types primitifs.

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

Lire un bloc try-catch dans le bytecode

Les gestionnaires d'exception apparaissent comme des entrées de la table des exceptions, visibles avec javap -v. Chaque entrée indique le début du bloc try, sa fin, le gestionnaire et le type capturé.

# 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

En-tête de fichier de classe

L'en-tête du fichier de classe contient le nombre magique (CAFEBABE), les versions majeure et mineure ainsi que les indicateurs d'accès. javap -v affiche la version majeure, qui correspond à la version de Java ayant compilé la classe.

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

Vérification rapide

Quel indicateur de javap affiche les codes opérationnels de la JVM pour chaque méthode ?

Récapitulatif

Utilisez javap -c pour les codes opérationnels et javap -v pour tous les détails. Retenez les codes opérationnels essentiels : invokevirtual, invokespecial, invokedynamic, getfield. Inspectez les lambdas, les conversions automatiques en objets et la concaténation de chaînes pour comprendre la sortie du compilateur.

Questions Fréquemment Posées

La leçon « Inspecter le bytecode avec javap » est-elle gratuite ?

Oui — le texte complet de « Inspecter le bytecode avec javap » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Inspecter le bytecode avec javap » ?

Décompilez des fichiers de classe avec javap -c afin de comprendre comment les constructions Java sont traduites en bytecode. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Java Academy ?

Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Inspecter le bytecode avec javap » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?

Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Phases de chargement des classes : chargement, liaison, initialisation
  2. Hiérarchie de ClassLoader et chargeurs personnalisés
  3. Inspecter le bytecode avec javap
  4. Compilation JIT et compilation par niveaux
← Retour à Java Academy