Notre projet fait une instrumentation Java ByTecode. Et nous avons trébuché sur un comportement étrange. Supposons que l'extrait de code suivant: Javac d'Oracle compile ce qui précède dans le byTecode suivant: p> 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
3 Réponses :
S'il y a un DUP STRAND> entre nouveau strud> et invocale strong> alors l'objet est généralement utilisé em> utilisé après la compilation. Par exemple, l'initialisation du champ est généralement une séquence de nouveau strong> strong> DUP STRAND>, invocale strong> &
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.
- 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? LI> ol> blockQuote>
Je ne suis pas sûr de ce que vous voulez dire exactement em>, 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. P>
Passer puis on pourrait utiliser ce fort> pour stocker le résultat :) p> amusez-vous :) p> p>
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 code> Javac CODE> 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?