2016-03-22 5 views
3

Voici le code généré a montré par javap quand je lui ai demandé d'afficher ma compilé classe (I sélectionné méthode)java javap et bytecode groovy comparaison

int multiply(int, int); 
    flags: 
    Code: 
    stack=2, locals=3, args_size=3 
     0: iload_1 
     1: iload_2 
     2: imul 
     3: ireturn 
    LineNumberTable: 
     line 2: 0 
    LocalVariableTable: 
     Start Length Slot Name Signature 
      0  4  0 this LMyClass; 
      0  4  1  a I 
      0  4  2  b I 

Voici le code qui apparaît par groovyConsole (même méthode)

public multiply(II)I 
    L0 
    LINENUMBER 4 L0 
    ILOAD 1 
    ILOAD 2 
    IMUL 
    IRETURN 
    L1 
    LDC 0 
    IRETURN 
    LOCALVARIABLE this LMyClass; L0 L1 0 
    LOCALVARIABLE a I L0 L1 1 
    LOCALVARIABLE b I L0 L1 2 
    MAXSTACK = 2 
    MAXLOCALS = 3 

Mais qui bytecode sont plus raw? Pour autant que je comprenne, javap ajouté un peu de style, donc le deuxième exemple devrait être plus authentique bytecode. Ai-je raison?

Répondre

2

Aucun de ces produits n'est plus brut. Il y a deux façons différentes de présenter exactement la même information.

+0

Je suis curieux de savoir lesquels d'entre eux sont plus précis dans l'affichage de la même manière que dans le fichier 'class' et à en juger par tous les assembleurs c'est la deuxième variante. – lapots

+0

Le fichier .class contient des données binaires. Pour cette raison, aucune de ces représentations ne montre les données de la même manière que dans le fichier de classe. – yole

0

Il semble que Javap et Groovy font une certaine quantité de sucre, mais de différentes manières, donc vous ne pouvez pas vraiment dire que l'un est plus "brut" que l'autre. Par exemple, Groovy affiche le descripteur de la méthode brute (II)I qui contient les sucres Javap, tandis que Javap affiche la pile et les comptages locaux et Groovy non.

Cela étant dit, aucun n'est particulièrement "brut". Javap est conçu pour aider au débogage Java, donc il y a un certain nombre de choses qu'il essaie de cacher ou de réécrire afin de rendre la sortie plus Java. Il n'est pas conçu pour gérer des fichiers de classes inhabituels ou malveillants.

Si vous voulez la sortie de démontage la plus "brute", votre meilleur choix est le Krakatau disassembler. Krakatau est le seul désassembleur qui peut représenter chaque petit détail dans un classfile arbitraire, y compris les fichiers de classes non-java et malicieusement construits.