Как я могу открывать файлы Java .class в удобном для чтения виде?

111

Я пытаюсь понять, что делает файл класса Java-апплета под капотом. Открытие его с помощью Блокнота или Текстовой панели просто показывает кучу глупостей.

Есть ли способ вернуть его в удобочитаемый формат, чтобы я мог попытаться понять, что он делает?

  • Среда == Установлена ​​Windows с VS 2008.
cpuguru
источник
7
Просто семантика, разве не должно быть одно = не два? == - это вопрос, а = - это утверждение, и вы делаете заявление о своей среде.
icco,
Вы можете прояснить этот вопрос? Я сразу подумал, что вы хотите прочитать настоящий байт-код, но кажется, что вы действительно хотите декомпилировать чужой код.
Outlaw Programmer
12
@icco, = означает присвоение, == означает равенство. Он говорит, что (Environment == Windows с установленной VS2008) верно, не давая указания установить Environment в Windows с установленной VS2008. Человек, который был оффтопом и ботаником.
Blorgbeard выйдет
7
Для записи == не декларирует равенство; он проверяет равенство. Вы можете написать true == false, и это примерно так же важно, как написать Environment == Windows w / VS 2008 installed, т.е. вообще не имеет смысла.
bwerks

Ответы:

208

jd-gui - лучший декомпилятор на данный момент. он может обрабатывать новые функции Java по сравнению с пылящим JAD.

DarenW
источник
1
Насколько актуален этот ответ в 2020 году?
The Coding Wombat,
Пока ссылка куда-то идет, я полагаю, это хорошо. Я бы не знал, есть ли сейчас лучший декомпилятор Java, так как я давно не использовал Java.
DarenW
77

Если вы не против чтения байт-кода, javap должен работать нормально. Это часть стандартной установки JDK.

Usage: javap <options> <classes>...

where options include:
   -c                        Disassemble the code
   -classpath <pathlist>     Specify where to find user class files
   -extdirs <dirs>           Override location of installed extensions
   -help                     Print this usage message
   -J<flag>                  Pass <flag> directly to the runtime system
   -l                        Print line number and local variable tables
   -public                   Show only public classes and members
   -protected                Show protected/public classes and members
   -package                  Show package/protected/public classes
                             and members (default)
   -private                  Show all classes and members
   -s                        Print internal type signatures
   -bootclasspath <pathlist> Override location of class files loaded
                             by the bootstrap class loader
   -verbose                  Print stack size, number of locals and args for methods
                             If verifying, print reasons for failure
Майкл Майерс
источник
9

Как указано @MichaelMyers, используйте

javap -c <name of java class file> 

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

javap -c <name of java class file> > decompiled.txt
Нилашиш Ц
источник
7

Вам нужен декомпилятор java, для этого можно использовать инструмент командной строки javap. Кроме того, Java Decompiler HOW-TO описывает, как вы можете декомпилировать файл класса.

Дрю Фрезелл
источник
2

то, что вы ищете, - это декомпилятор java. Я рекомендую JAD http://www.kpdus.com/jad.html. Он бесплатный для некоммерческого использования и выполняет свою работу.

Примечание: это не сделает код точно таким же, как был написан. т.е. вы потеряете комментарии и, возможно, имена переменных, так что это будет немного сложнее, чем просто читать обычный исходный код. Если разработчик действительно скрытный, он также запутает свой код, что сделает его еще более трудным для чтения.

Давид Белезнай
источник
2

cpuguru, если ваш апплет был скомпилирован с использованием javac 1.3 (или менее), лучшим вариантом будет использование Jad.

К сожалению, последний JDK, поддерживаемый JAD 1.5.8 (14 апреля 2001 г.), - это JDK 1.3.

Если ваш апплет был скомпилирован с помощью более свежего компилятора, вы можете попробовать JD-GUI : этот декомпилятор находится в стадии разработки, тем не менее, он генерирует правильные исходные коды Java, большую часть времени, для классов, скомпилированных с JDK 1.4, 1.5 или 1.6.

DarenW, спасибо за ваш пост. JD-GUI еще не лучший декомпилятор ... но я над этим работаю :)

Эммануэль Дюпюи
источник
2

Использование Jad для декомпиляции, вероятно, ваш лучший вариант. Если код не был запутан, результат будет нормальным.

Расмус Фабер
источник
1

Вам нужно использовать декомпилятор. Другие предлагали JAD, есть другие варианты, JAD - лучший.

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

Зак Гоченур
источник
1

Разумеется, JAD и / или JADclipse Eclipse.

Джон Гарднер
источник
1

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

arturh
источник
0

Как было предложено, вы можете использовать JAD для его декомпиляции и просмотра файлов. Чтобы упростить чтение, вы можете использовать плагин JADclipse для eclipse, чтобы напрямую интегрировать JAD в eclipse, или использовать DJ Java Decompiler, который намного проще в использовании, чем JAD из командной строки.


источник
0

JAD - отличный вариант, если в результате вам нужен читаемый код Java. Однако, если вы действительно хотите углубиться во внутреннее устройство .classформата файла, вам понадобится javap. Он связан с JDK и позволяет вам «декомпилировать» шестнадцатеричный байт-код в читаемый ASCII. Создаваемый им язык по-прежнему является байт-кодом (не похожим на Java), но он довольно читабелен и чрезвычайно поучителен.

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

Даниэль Спивак
источник
0

Декомпилировать Applet.class не нужно. Исходный код общедоступных классов Java API поставляется с JDK (если вы решите установить его) и он лучше читается, чем декомпилированный байт-код. Вы можете найти его в сжатом виде в src.zip (находится в папке установки JDK).

Arno
источник