Maison >Java >javaDidacticiel >Comment utiliser Javap pour analyser les constantes entières et les variables entières Java
Le contenu de cet article explique comment utiliser Javap pour analyser les constantes entières et les variables entières Java. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Les cinquième et neuvième lignes de mon code ci-dessous définissent respectivement une variable entière et une constante entière :
static final int number1 = 512; static int number3 = 545;
Les programmeurs Java connaissent tous la différence entre les deux.
Ensuite, nous utiliserons javap pour décompiler le fichier .class, puis nous plongerons dans la différence entre les variables entières et les constantes entières en Java.
Utilisez la ligne de commande javap -c constant.ConstantFolding pour afficher le bytecode décompilé à partir du fichier .class :
Résultat :
La description de ces instructions de bytecode est expliquée dans wikipedia :
wiki : https://en.wikipedia .org/ wiki...
Nous, les programmeurs Java, n'avons pas besoin de tous les mémoriser, nous avons juste besoin de mettre cette page Web dans nos favoris et de l'utiliser comme dictionnaire en cas de besoin :
sipush 545 : Placer l'entier 545 sur la pile
putstatic #16 :
Attribuer la valeur 545 sur la pile à la classe actuelle dans le statique champ.
Alors, que signifie le numéro 16 dans putstatic #16 ?
Si nous utilisons le paramètre javap -v pour décompiler, nous pouvons voir le pool constant de cette classe (Constant pool). Regardez la ligne en surbrillance bleue dans l'image ci-dessous :
constant/ConstantFolding. .number3:I
Description #16 représente le membre numéro3 de la classe constante.ConstantFolding, le type est I.
À ce stade, ces deux lignes d'instructions de bytecode sont combinées et correspondent en fait au code Java que nous avons écrit :
static int number3 = 545;
On continue d'analyser le bytecode décompilé par javap.
aload_0 : Charger l'introduction des variables locales de numéro de série 0 sur la pile
invokespecial : Invoquer des membres sur l'instance d'objet Méthode, s'il y a une valeur de retour, la valeur de retour de la méthode est stockée sur la pile. La méthode spécifique appelée est identifiée par # et le nom de la méthode correspondante peut être interrogé dans le pool de constantes.
ldc : chargez la valeur de la constante nommée #
Nous pouvons constater à partir de la liste des pools de constantes dans la figure ci-dessous que la constante 318976 avec le numéro de série #29 est exactement le produit de la constante entière numéro1 (512) et de la constante entière (623). On peut voir de là que l'expression numéro1 * numéro2, parce que les deux opérandes impliqués dans l'opération sont devenus des constantes entières grâce aux modifications STATIC et FINAL, le produit peut être obtenu au moment de la compilation, donc le compilateur le calcule au moment de la compilation Sortez et stockez-le dans le pool de variables avec le numéro de séquence #29.
Alors, quel est le bytecode correspondant pour la multiplication de variables entières ?
Commencez à partir du code numéro 3 dans la figure ci-dessous :
getstatic #16 : Chargez le membre statique #16 de la classe sur la pile. Le membre correspondant de #16 est le numéro3 et la valeur est 545.
getstatic #18 : Chargez le membre statique #18 de la classe sur la pile. Le membre correspondant de #18 est le numéro4 et la valeur est 619.
imul : Effectue la multiplication de deux entiers sur la pile.
istore_2 : Enregistrez le résultat dans la variable locale 2.
À ce moment, le int product2 = number3 * number4 dans notre code Java a été exécuté.
Le bytecode bleu restant que vous voyez correspond à la ligne suivante de la déclaration d'impression.
System.out.println("Value: " + product1 + " , " + product2);
Il ressort également de ces bytecodes qu'en Java, nous utilisons directement le signe plus pour effectuer des opérations d'épissage de chaînes. Le compilateur Java utilise automatiquement StringBuilder pour l'optimisation lors de la compilation.
Puisque le produit de variables entières doit être imprimé, iload_2 du bytecode charge le résultat du calcul précédemment enregistré dans la variable locale 2 avec istore_2 sur la pile, afin que le résultat du produit puisse enfin être sorti.
J'espère qu'à travers cet exemple simple, tout le monde pourra apprendre à utiliser javap pour comprendre en profondeur certains détails de Java et de JVM.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!