Как "декомпилировать" файлы классов 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 на страницу и увидеть декомпилированный исходный код, ничего не устанавливая.
Есть несколько декомпиляторов... Быстрый поиск дает:
- Procyon: с открытым исходным кодом (Apache 2) и активно развивающийся
- Кракатау: с открытым исходным кодом (GPLv3) и активно развивается
- CFR: с открытым исходным кодом (MIT) и активно развивается
- JAD
- DJ Java Decompiler
- кофе мокко
И многое другое
Они производят код Java. Java поставляется с чем-то, что позволяет вам видеть байт-код JVM ( javap).
Чтобы увидеть исходный код Java, проверьте декомпилятор. Иди ищи джад.
Если вы хотите увидеть байт-коды, просто используйте javap, который поставляется с JDK.
Я попробовал несколько, и Процион, казалось, работал лучше для меня. Он находится в стадии активной разработки и поддерживает многие функции последних версий Java.
Это другие, которые я пробовал:
- CFR
- Перспективный, но часто провальный метод декомпиляции. Я буду следить за этим. Также активно развивается с поддержкой новейших функций Java.
- Кракатау
- Использует другой подход в том смысле, что он пытается вывести эквивалентный Java-код вместо того, чтобы пытаться восстановить исходный код, что может улучшить его для запутанного кода. Из моих испытаний это было примерно наравне с Procyon, но все же приятно иметь что-то другое. Я должен был использовать
-skip
флаг командной строки, чтобы он не останавливался на ошибках. Активно развивается и, что интересно, написано на Python.
- Использует другой подход в том смысле, что он пытается вывести эквивалентный Java-код вместо того, чтобы пытаться восстановить исходный код, что может улучшить его для запутанного кода. Из моих испытаний это было примерно наравне с Procyon, но все же приятно иметь что-то другое. Я должен был использовать
- JD-GUI
- Сработало, но вывод Проциона был намного лучше. Вот страница, сравнивающая вывод Procyon с оригиналом и JD-GUI. JD-GUI также доступен как плагин Eclipse, который у меня вообще не работал. Не похоже на открытый исходный код, и развитие кажется спорадическим.
- JAD
- Работал, но поддерживает только Java 1.4 и ниже. Также доступен как плагин Eclipse. Больше не в разработке.
Я использую JAD Decompiler.
Для этого есть плагин Eclipse, jadeclipse. Это довольно мило.
Сажа - это опция для более нового Java-кода. По крайней мере, у него есть преимущество, которое все еще поддерживается недавно...
Кроме того, Java Decompiler - это декомпилятор с автономным графическим интерфейсом и интеграцией Eclipse.
И, наконец, Jdec не упоминается, хотя он не так совершенен, как другие варианты.
Вот список декомпиляторов по состоянию на февраль 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, но иногда код будет запутан, поэтому методы будут именоваться одной буквой или цифрой или случайным сочетанием букв и цифр.
Большинство декомпиляторов для Java основаны на JAD. Это отличный инструмент, но, к сожалению, он давно не обновлялся и не очень хорошо обрабатывает классы Java 1.5+. Я не видел никаких инструментов, которые будут правильно обрабатывать 1,5+ классов.
Все ссылки JAD, перечисленные до сих пор, кажутся сломанными, поэтому я нашел этот сайт. Прекрасно работает (для Linux, по крайней мере)! На Ubuntu 11.10 мне пришлось по какой-то причине загрузить статический файл.
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.