2015-01-27 1 views
1

Я породившей два Java байткодом файлы 1.class и 2.class, они отличаются при использовании просмотрщик шестнадцатеричный файл проверить их:Различные Java байткод декомпилировать в точно такой же п-кода и кода Java

enter image description here

Однако декомпилированы р-код все равно:

Я могу также использовать JD-GUI декомпилировать их в исходный код Java и снова файлы два байта кода генерировать точно такой же исходный Java код:

enter image description here

Так выглядит все хорошо, однако, когда я загрузить две копии байткод в класс загрузчика, то 1.class копия дает мне следующие ошибки:

enter image description here

Любой имеет подскажите?

+0

Выполнить 'javap -c -l 1.class' и проверить, указали ли все записи в LineNumberTable на действительный индекс байт-кода. Вы даже можете сделать diff с выходом из 2.class. Это должно показать вам различия. – SubOptimal

+0

@SubOptimal да, вы правы. Я сделал это и понял различия. Странно, что представление ASM bytecode outline не дало мне информации –

ответ

3

Если вы печатаете информацию номер строки с помощью javap -l, вы можете обнаружить, что 2.class имеет следующую строку номер таблицы для doIt(String, String, AppContext):

LineNumberTable: 
    line 56: 0 
    line 57: 11 
    line 58: 19 
    line 60: 23 
    line 61: 65 

В соответствии с этим, номер строки 61 ссылки на индекс байта кода 65 в то время как тот же метод определяется всего 64 байт. Соответственно, эта таблица не может быть правильной, и возникает ошибка проверки правильности.

+0

Точно я также захватил это, и теперь проблема устранена, удалив инструкцию LINE NUMBER до команды RETURN –

 Смежные вопросы

  • Нет связанных вопросов^_^