Quels paramètres affectent la disposition des fichiers .class java compilés? Comment savoir si deux classes compilées sont égales?

StackOverflow https://stackoverflow.com/questions/644320

Question

J'ai une application compilée avec Eclipse intégré "Compile". tâche. Ensuite, j'ai décidé de déplacer la procédure de construction dans javac d'Ant, et le résultat a fini par être des fichiers plus petits.

Plus tard, j'ai découvert que le réglage du niveau de débogage sur "vars, lines, source" et "" permettait d'incorporer les mêmes informations de débogage qu'Eclipse et que, dans de nombreux cas, les fichiers restaient exactement de la même taille, mais la disposition interne était différente. Et par conséquent, je ne pouvais pas utiliser les signatures md5sum pour déterminer si elles correspondaient exactement à la même version.

Outre les informations de débogage, quelle peut être la raison pour laquelle deux fichiers supposément égaux ont une structure ou une taille interne différente?

Et comment pouvez-vous comparer des fichiers .class compilés?

Était-ce utile?

La solution

Il n’existe aucun ordre requis pour des éléments tels que l’ordre des entrées de pool constantes (essentiellement toute l’information sur le symbole) ainsi que les attributs de chaque champ / méthode / classe. Différents compilateurs sont libres d’écrire dans l’ordre de leur choix.

Vous pouvez comparer les classes compilées, mais vous devez creuser et structurer la structure du fichier de classe. Il existe des bibliothèques pour le faire, comme BCEL ou ASM , mais je ne suis pas sûr à 100% qu’ils vous aideront à faire ce que vous voulez faire.

Autres conseils

Le plugin d'ASM Eclipse contient un comparateur de code d'octet. Vous sélectionnez deux classes, cliquez avec le bouton droit de la souris et faites Comparer avec chaque autre bytecode.

Il est important de noter qu’Eclipse n’utilise pas javac. Eclipse a son propre compilateur, le JDT , et présente donc des différences dans les résultats. les dossiers de classe ne me surprennent pas. Je m'attendrais à ce qu'ils ne soient pas textuels, car ce sont des compilateurs différents.

En raison de leurs différences, il existe un code qui compile avec javac mais pas JDT, et inversement. En général, j'ai constaté que les différences entre les deux apparaissaient clairement dans les cas de forte utilisation de génériques

Plus important encore, les emplacements de pile pour les variables locales peuvent être arrangés de manière arbitraire sans changer la sémantique du code. En résumé, vous ne pouvez pas comparer les fichiers de classe compilés sans les analyser et les normaliser - beaucoup d’efforts.

Pourquoi voulez-vous faire cela quand même?

comme l'a dit Michale B, cela peut être arbitraire.

Je travaille sur des systèmes qui utilisent des tailles de fichiers comme sécurité. Si la taille des fichiers .class change, la classe ne recevra pas certaines autorisations.

Normalement, ce serait facile à déplacer, mais nous avons un contrôle assez complet sur l'environnement, donc c'est en fait assez fonctionnel.

Quoi qu’il en soit, il semble que chaque fois que les classes regardées sont recompilées, nous devons recalculer la taille.

Autre chose - un numéro de clé spécial est généré lors de la compilation du fichier. Je ne sais pas grand chose à ce sujet, mais cela empêche souvent les classes de travailler ensemble. Je crois que la procédure est la suivante: compilez la classe A et sauvegardez-la (appelez-la a1). compiler à nouveau la classe a (a2). Compilez la classe b contre la classe a2. Essayez de courir b contre a1. Je crois que dans ce cas, il échouera au moment de l'exécution.

Si vous pouviez en savoir plus sur ce numéro de clé, il pourrait vous donner les informations recherchées.

Pour le comparisson, vous pouvez décompiler vos fichiers de classe et jouer avec les sources générées. Voir ceci .

Eclipse utilise-t-il des instruments pour vous aider à exécuter le débogueur?

En fin de compte, les configurations utilisées font probablement la différence. En supposant qu'ils utilisent les mêmes versions de Java, de nombreuses options sont disponibles pour la configuration de la compilation (conformité JDK, compatibilité des fichiers de classe et de nombreuses options d'informations de débogage).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top