Як я можу відкрити файли Java .class легко читаним способом?


111

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

Чи є якийсь спосіб повернути його в дещо читабельний формат, щоб я спробував розібратися, що це робить?

  • Середовище == Встановлено Windows w / VS 2008.

7
Просто семантика, чи не має бути це один = не два? == - це питання, тоді як = це твердження, і ви робите заяву про своє оточення.
icco

Чи можете ви уточнити це питання? Моя негайна думка полягала в тому, що ви хочете прочитати фактичний байт-код, але, здається, ви насправді хочете декомпілювати чужий код.
Програміст поза законом

12
@icco, = означає присвоєння, == означає рівність. Він каже, що (Environment == Windows w / VS2008 встановлено) є правдою, не даючи наказу встановлювати середовище для встановленої Windows w / VS2008. Людина, яка була офтопічною і глуповатою.
Blorgbeard вийшов

7
Для запису == не оголошує рівність; це перевіряє рівність. Ви можете написати true == false, і це настільки ж значуще, як написання Environment == Windows w / VS 2008 встановлений, тобто зовсім не має сенсу.
bwerks

Відповіді:


208

jd-gui - найкращий декомпілятор на даний момент. він може обробляти новіші можливості на Java, порівняно із запорошеною JAD.


1
Наскільки актуальною є ця відповідь у 2020 році?
Кодування 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, більшість часу для класів, складених з JDKs 1.4, 1.5 або 1.6.

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



2

Використання Jad для декомпіляції - це, мабуть, найкращий варіант. Якщо код не прихований, він дасть нормальний результат.



1

Потрібно використовувати декомпілятор. Інші запропонували JAD, є й інші варіанти, JAD - найкращий.

Я перегукую коментарі, які ви можете трохи втратити порівняно з вихідним вихідним кодом. Це буде виглядати особливо смішно, якщо в коді використовуються дженерики, через стирання.



1

Якщо файл класу, який ви хочете переглянути, є відкритим кодом, не слід його декомпілювати, а замість цього приєднати вихідні файли безпосередньо у свій IDE. таким чином, ви можете просто переглядати код якогось класу бібліотеки так, ніби це був ваш власний


0

Як пропонується, ви можете використовувати JAD для його декомпіляції та перегляду файлів. Щоб полегшити читання, ви можете використовувати плагін JADclipse для затемнення, щоб інтегрувати JAD безпосередньо в затемнення або використовувати DJ Java Decompiler, що набагато простіше, ніж командний рядок JAD


0

JAD - це відмінний варіант, якщо ви хочете, щоб в результаті читався код Java. Якщо ви дійсно хочете зануритися у внутрішній .classформат файлу, ви хочете javap. Він в комплекті з JDK і дозволяє "декомпілювати" шістнадцятковий байт-код на читабельний ASCII. Мова, яку він виробляє, все ще є байт-кодом (не що-небудь схоже на Java), але він є досить читабельним і надзвичайно повчальним.

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


0

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



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.