Maison  >  Article  >  Java  >  Comment utiliser Javap pour analyser les constantes entières et les variables entières Java

Comment utiliser Javap pour analyser les constantes entières et les variables entières Java

不言
不言avant
2018-10-22 15:39:162815parcourir

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.

Comment utiliser Javap pour analyser les constantes entières et les variables entières Java

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 :

Comment utiliser Javap pour analyser les constantes entières et les variables entières Java

Résultat :

Comment utiliser Javap pour analyser les constantes entières et les variables entières Java

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 :

Comment utiliser Javap pour analyser les constantes entières et les variables entières Java

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.

Comment utiliser Javap pour analyser les constantes entières et les variables entières Java

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.

Comment utiliser Javap pour analyser les constantes entières et les variables entières Java

À 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.

Comment utiliser Javap pour analyser les constantes entières et les variables entières Java

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 # du pool de constantes sur la pile.

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.

Comment utiliser Javap pour analyser les constantes entières et les variables entières Java

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.

Comment utiliser Javap pour analyser les constantes entières et les variables entières Java

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer