12
votes

Différences de Java Bytecode produit par les compilateurs d'Oracle et Eclipse

Notre projet fait une instrumentation Java ByTecode. Et nous avons trébuché sur un comportement étrange. Supposons que l'extrait de code suivant: xxx pré>

Javac d'Oracle compile ce qui précède dans le byTecode suivant: p> xxx pré>

et compilateur d'Eclipse dans: P >

   0:   new #15; //class java/lang/Integer
   3:   iconst_2
   4:   invokespecial   #17; //Method java/lang/Integer."<init>":(I)V
   7:   return


2 commentaires

Quel est votre objectif avec l'instrumentation du bytecode? Cette différence cause-t-elle un problème pour vous? Notez qu'il n'y a aucune garantie sur ce que ByTecode exactement un compilateur Java produira. Il est tout à fait possible que dans une future version d'oracle Javac produira quelque chose de différent de ce que vous voyez maintenant - il n'est donc pas une bonne idée d'écrire un programme qui s'appuie fortement sur le bypode exact produit par le compilateur.


Utilisez-vous différents JDK pour Eclipse?


3 Réponses :


6
votes

S'il y a un DUP entre nouveau et invocale alors l'objet est généralement utilisé utilisé après la compilation. Par exemple, l'initialisation du champ est généralement une séquence de nouveau DUP , invocale & putfield . Cependant, dans votre exemple, la dernière instruction est pop qui nettoie l'objetRef de la pile - c'est ainsi que vous pouvez supposer que cet objet n'est pas utilisé.


1 commentaires

Comme indiqué par A.H., le Pop signifie que cela n'est pas utilisé par l'appelant. L'objet lui-même pourrait donner des références à elles-mêmes dans la CTOR.



3
votes
  1. Puis-je conclure en toute sécurité, que s'il n'y a pas de "DUP" entre "Nouveau" et "Invokespecial", l'objet n'est pas utilisé après l'initialisation?

    Je ne suis pas sûr de ce que vous voulez dire exactement , mais une référence à l'objet créé peut être stockée quelque part par le constructeur. Par conséquent, la méthode d'appel peut ne pas utiliser l'objet après l'initialisation, mais l'objet peut toujours être accessible et pourrait ne pas être des ordures à collectionner.


0 commentaires

1
votes

Passer Cette référence brisera ce modèle un peu xxx

puis on pourrait utiliser ce pour stocker le résultat :) xxx

amusez-vous :)


0 commentaires