2016-03-22 3 views
3

Вот код, генерируемый показал на javap, когда я попросил его показать мой скомпилированный класс (я выбрал метод)Java javap и заводной сравнение байткодом

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 

Вот код, который отображается на groovyConsole (тот же метод)

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 

Но какой байткод более raw? Насколько я понимаю, javap добавил к нему некоторый стиль, поэтому второй пример должен быть более подлинным bytecode. Я прав?

ответ

2

Ни один из них не является более сырым. Существует всего два разных способа представления точно такой же информации.

+0

Мне любопытно, какие из них точнее отображать его так же, как в файле 'class', и, судя по всем ассемблерам, это второй вариант. – lapots

+0

Файл .class содержит двоичные данные. Из-за этого ни одно из этих представлений не отображает данные так же, как они хранятся в файле класса. – yole

0

Похоже, что и Javap, и Groovy делают некоторое количество сахарирования, но по-разному, поэтому вы не можете сказать, что один более «сырой», чем другой. Например, Groovy отображает дескриптор необработанного метода (II)I, который сахара Javap, в то время как Javap отображает стек и подсчеты locals, а Groovy - нет.

Это, как говорится, не является особенно «сырым». Javap разработан, чтобы помочь с отладкой Java, поэтому есть ряд вещей, которые он пытается скрыть или переписать, чтобы сделать вывод более похожим на Java. Он не предназначен для обработки необычных или злонамеренно построенных файлов классов вообще.

Если вам нужен самый «сырой» выход для разборки, лучшим выбором является Krakatau disassembler. Krakatau - единственный дизассемблер, который может представлять каждую маленькую деталь в произвольном файле класса, включая не-java и злонамеренно построенные файлы классов.