Сравните файл.java с файлом.class

В моей ситуации у меня много .jar файлы, создаваемые в процессе сборки. Прежде чем приступать к отладке, я хочу быстро проверить, что мой .java источник соответствует .class найдено в .jar,

Я полагаю, что если я распакую .jar и найти .class что соответствует моему .java файл, то я должен быть в состоянии определить, если они функционально одинаковы.

Как я могу это сделать?

3 ответа

Решение

Первое, что нужно понять, это то, что компиляция не просто использует конкретный файл.java для скомпилированного класса. Компилятор также использует информацию из других файлов.java и.class, доступных во время компиляции. Например, это могут быть встроенные статические конечные константы. Кроме того, такая перегрузка метода зависит от того, какие методы были определены.

При этом, если вы скомпилируете тот же исходный файл с тем же компилятором, что и раньше, вы, вероятно, получите тот же или очень похожий файл класса. Однако даже при одинаковых исходных файлах разные компиляторы (javac vs eclipse) и разные версии компилятора будут давать разные результаты.

Поэтому, что я бы порекомендовал, сначала попробуйте скомпилировать все и посмотреть, совпадают ли файлы классов. Если файлы классов не совпадают, попробуйте разобрать их с помощью дизассемблера Krakatau и выполнить разборку по дизассемблерам, чтобы увидеть различия. Это поможет вам увидеть, если разница не важна (например, переупорядочение пула констант) или есть существенные изменения в байт-коде.

Может быть, вам будет достаточно, если вы сможете использовать декомпилятор? Например, из IntelliJ IDE, чтобы узнать, каков источник для вашего скомпилированного класса. Вы даже можете отладить декомпилированный источник.

Вы можете использовать Java-декомпилятор, такой как http://jd.benow.ca/, чтобы иметь возможность просматривать соответствующий источник вашего файла класса, тогда вы сможете сравнить его с вашим Java-файлом.

Другие вопросы по тегам