Поиск различий между версиями файла класса Java
-
01-07-2019 - |
Вопрос
Я работаю с большим веб-приложением Java от коммерческого поставщика.Я получил исправление от поставщика в виде нового файла .class, которое должно решить проблему, возникшую у нас с программным обеспечением.В прошлом применение патчей от этого поставщика приводило к возникновению новых и совершенно не связанных с этим проблем, поэтому я хочу понять вносимое изменение еще до того, как применять его к тестовому экземпляру.
У меня есть два файла .class рядом: один, извлеченный из текущей версии, и обновленный от поставщика. ДЖАД и JReversePro как декомпилировать, так и дизассемблировать (соответственно) две версии для получения одного и того же результата.Однако файлы .class имеют разные размеры, и я вижу различия в выводе od -x
, так что они определенно не идентичны.
Какие еще шаги я могу предпринять, чтобы определить разницу между двумя файлами?
Заключение:
Спасибо за отличные ответы.С javap -c
вывод также идентичен для двух файлов классов, я делаю вывод, что Давр прав, и поставщик прислал мне плацебо.По этой причине я принимаю ответ Давра, но именно Крис Маршалл и Джон Мигер подтолкнули меня к javap, так что спасибо всем троим.
Решение
Возможно, они просто скомпилировали его с новой версией Java-компилятора или с другими настройками оптимизации и т. д., так что функциональность та же, и код тот же, но выходной байт-код немного другой.
Другие советы
Если вы ищете различия в уровнях API, javap инструмент может оказаться большим подспорьем.Он выведет сигнатуры методов, которые можно будет вывести в обычные текстовые файлы и сравнить с помощью обычных инструментов сравнения.
Вы можете попробовать использовать инструмент сравнения (например, бесплатный инструмент DiffMerge от SourceGear) для декомпилированных исходников.Это должно выявить различия в файлах, хотя, скорее всего, будут выявлены «незначительные» различия, например, если в двух версиях переменные были названы по-разному.
Вы можете использовать javap (в $JDK_HOME/bin) для декомпиляции файлов java .class.Он сообщит вам (например), версию файла класса, среди прочего.