Как "декомпилировать" файлы классов Java?

Какую программу я могу использовать для декомпиляции файла класса? Получу ли я на самом деле Java-код или это просто код сборки JVM?

На вопросы производительности Java на этом сайте я часто вижу ответы людей, которые "декомпилировали" файл классов Java, чтобы увидеть, как компилятор оптимизирует определенные вещи.

19 ответов

Решение

Обновление февраля 2016:

http://www.javadecompilers.com/ перечисляет JAD как:

самый популярный декомпилятор Java, но в основном только в этом возрасте. Написано на C++, поэтому очень быстро.
Устаревший, неподдерживаемый и неправильно декомпилируемый Java 5 и новее

Таким образом, ваш пробег может варьироваться в зависимости от недавнего JDK (7, 8).

На этом же сайте перечислены другие инструменты.

А javadecompiler, как отметил Salvador Valencia в комментариях (сентябрь 2017 г.), предлагает SaaS, куда вы загружаете .class файл в облако, и он возвращает вам декомпилированный код.


Оригинальный ответ: октябрь 2008

  • Окончательный выпуск JSR 176, определяющий основные функции J2SE 5.0 (Java SE 5), был опубликован 30 сентября 2004 года.
  • Последней версией Java, поддерживаемой JAD, известным декомпилятором Java, написанным г-ном Павлом Кузнецовым, является JDK 1.3.
  • Большинство декомпиляторов Java, загружаемых сегодня из Интернета, таких как "DJ Java Decompiler" или "Cavaj Java Decompiler", работают на базе JAD: они не могут отображать источники Java 5.

Декомпилятор Java (еще один декомпилятор Fast Java) имеет:

  • Явная поддержка декомпиляции и анализа файлов Java 5+ ".class".
  • Хороший графический интерфейс:

Скриншот

Он работает с компиляторами от JDK 1.1.8 до JDK 1.7.0 и другими ( Jikes, JRockit и т. Д.).

Он показывает онлайн демо-версию, которая на самом деле полностью функциональна! Вы можете просто поместить файл jar на страницу и увидеть декомпилированный исходный код, ничего не устанавливая.

Есть несколько декомпиляторов... Быстрый поиск дает:

  1. Procyon: с открытым исходным кодом (Apache 2) и активно развивающийся
  2. Кракатау: с открытым исходным кодом (GPLv3) и активно развивается
  3. CFR: с открытым исходным кодом (MIT) и активно развивается
  4. JAD
  5. DJ Java Decompiler
  6. кофе мокко

И многое другое

Они производят код Java. Java поставляется с чем-то, что позволяет вам видеть байт-код JVM ( javap).

Чтобы увидеть исходный код Java, проверьте декомпилятор. Иди ищи джад.

Если вы хотите увидеть байт-коды, просто используйте javap, который поставляется с JDK.

Я попробовал несколько, и Процион, казалось, работал лучше для меня. Он находится в стадии активной разработки и поддерживает многие функции последних версий Java.

Это другие, которые я пробовал:

  • CFR
    • Перспективный, но часто провальный метод декомпиляции. Я буду следить за этим. Также активно развивается с поддержкой новейших функций Java.
  • Кракатау
    • Использует другой подход в том смысле, что он пытается вывести эквивалентный Java-код вместо того, чтобы пытаться восстановить исходный код, что может улучшить его для запутанного кода. Из моих испытаний это было примерно наравне с Procyon, но все же приятно иметь что-то другое. Я должен был использовать -skip флаг командной строки, чтобы он не останавливался на ошибках. Активно развивается и, что интересно, написано на Python.
  • JD-GUI
  • JAD
    • Работал, но поддерживает только Java 1.4 и ниже. Также доступен как плагин Eclipse. Больше не в разработке.

Я использую JAD Decompiler.

Для этого есть плагин Eclipse, jadeclipse. Это довольно мило.

Procyon включает в себя декомпилятор. Это FOSS.

Сажа - это опция для более нового Java-кода. По крайней мере, у него есть преимущество, которое все еще поддерживается недавно...

Кроме того, Java Decompiler - это декомпилятор с автономным графическим интерфейсом и интеграцией Eclipse.

И, наконец, Jdec не упоминается, хотя он не так совершенен, как другие варианты.

JD-GUI действительно хорош. Вы можете просто открыть файл JAR и просмотреть код, как будто вы работаете над IDE. Хорошая вещь.

Вот список декомпиляторов по состоянию на февраль 2015 года:

Procyon, с открытым исходным кодом, https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

CFR, бесплатно, исходный код недоступен, http://www.benf.org/other/cfr/

JD, бесплатно только для некоммерческого использования, http://jd.benow.ca/

Fernflower, с открытым исходным кодом, https://github.com/fesh0r/fernflower,

JAD - дано здесь только по историческим причинам. Бесплатный, без исходного кода, http://varaneckas.com/jad/ Устаревший, неподдерживаемый и неправильно декомпилирующий Java 5 и более поздние версии.

Вы можете протестировать вышеупомянутые декомпиляторы онлайн, установка не требуется и сделать свой собственный выбор.

Java-декомпиляторы в облаке: http://www.javadecompilers.com/

Есть несколько программ, которые вы можете использовать. Вы получите реальный код Java, но иногда код будет запутан, поэтому методы будут именоваться одной буквой или цифрой или случайным сочетанием букв и цифр.

DJ декомпилятор мокко

Большинство декомпиляторов для Java основаны на JAD. Это отличный инструмент, но, к сожалению, он давно не обновлялся и не очень хорошо обрабатывает классы Java 1.5+. Я не видел никаких инструментов, которые будут правильно обрабатывать 1,5+ классов.

Все ссылки JAD, перечисленные до сих пор, кажутся сломанными, поэтому я нашел этот сайт. Прекрасно работает (для Linux, по крайней мере)! На Ubuntu 11.10 мне пришлось по какой-то причине загрузить статический файл.

http://www.varaneckas.com/jad

Посмотрите на каважа.

  • JAD - это тот, который работает и прост.

  • Кроме того, если вы просто хотите увидеть методы, используйте javap.

Если вы хотите увидеть, как Java-компилятор делает определенные вещи, вам не нужна декомпиляция, вам нужна дизассемблирование. Декомпиляция включает в себя преобразование байт-кода в исходный код Java, что означает потерю большого количества низкоуровневой информации, и, если вам интересно узнать об оптимизации компилятора, это, вероятно, именно та информация, которая вас интересует.

В любом случае, я написал дизассемблер Java с открытым исходным кодом. В отличие от Javap, это работает даже на высокопатогенных классах, поэтому вы можете видеть, что инструменты запутывания делают с вашими классами. Это может также сделать декомпиляцию, хотя я не рекомендовал бы это.

JAD не работает для меня (выпуск Ubuntu 11.10), поэтому я продвинулся вперед и остановился на JODO. По крайней мере, он имеет исходный код Open Java и смог правильно декомпилировать мой .class.

Я рекомендую сначала проверить "ветки / общие" ветки. Стволы не стабильны.

На платформе IntelliJ IDEA вы можете использовать Java Decompiler IntelliJ Plugin. Он позволяет вам отображать все источники Java во время процесса отладки, даже если у вас их нет все. Он основан на известных инструментах JD-GUI.

Для OSX я рекомендую: jarzilla или JD-GUI

Они оба позволяют просматривать банку, войну и т. Д. содержимое файла и декомпилирует любые файлы классов внутри них.

Джарзилла: https://code.google.com/p/jarzilla/
JD-GUI: http://jd.benow.ca/

С помощью AndroChef Java Decompiler вы можете декомпилировать файлы классов apk, dex, jar и java. Это просто и легко. AndroChef JD основан на FernFlower. Вы можете оценить это в 10 бесплатных использованиях.

AndroChef поддерживает такие функции языка Java, как обобщения, перечисления и аннотации. Согласно некоторым исследованиям, AndroChef Java Decompiler способен декомпилировать 98,04% Java-приложений, созданных с помощью традиционных Java-компиляторов - очень высокая скорость восстановления. Это простой, но мощный инструмент, который позволяет декомпилировать байт-код Java и Dalvik (DEX, APK) в читаемый исходный код Java.

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