Jak mogę otwierać pliki Java .class w sposób czytelny dla człowieka?

111

Próbuję dowiedzieć się, co robi plik klas apletu Java pod maską. Otwarcie go za pomocą Notatnika lub TextPada pokazuje tylko kilka gobbledy-gook.

Czy jest jakiś sposób, aby przywrócić go do nieco czytelnego formatu, abym mógł spróbować dowiedzieć się, co robi?

  • Środowisko == Windows z zainstalowanym VS 2008.
cpuguru
źródło
7
Tylko kwestia semantyki, czy nie powinno to być jeden = nie dwa? == to pytanie, podczas gdy = to stwierdzenie, a Ty wypowiadasz się na temat swojego środowiska.
icco,
Czy możesz wyjaśnić to pytanie? Od razu pomyślałem, że chcesz przeczytać rzeczywisty kod bajtowy, ale wygląda na to, że faktycznie chcesz zdekompilować kod kogoś innego.
Outlaw Programmer
12
@icco, = oznacza przypisanie, == oznacza równość. Mówi, że (Środowisko == Windows z zainstalowanym VS2008) jest prawdą, nie dając rozkazu ustawienia Środowiska na Windows z zainstalowanym VS2008. Człowieka, który był offtopic i kujony.
Blorgbeard wychodzi
7
Dla przypomnienia == nie deklaruje równości; sprawdza równość. Możesz napisać true == false i jest to mniej więcej tak samo sensowne, jak napisanie Environment == Windows z zainstalowanym programem VS 2008, tj. W ogóle nie ma znaczenia.
bwerks

Odpowiedzi:

208

jd-gui jest obecnie najlepszym dekompilatorem. może obsługiwać nowsze funkcje w Javie, w porównaniu do coraz bardziej zakurzonego JADa.

DarenW
źródło
1
Jak aktualna jest ta odpowiedź w 2020 roku?
The Coding Wombat
Jeśli łącze gdzieś prowadzi, przypuszczam, że jest dobre. Nie wiedziałbym, czy jest teraz lepszy dekompilator Java, ponieważ nie używałem Javy od dawna.
Daren W
77

Jeśli nie masz nic przeciwko czytaniu kodu bajtowego, javap powinien działać dobrze. Jest częścią standardowej instalacji 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
Michael Myers
źródło
9

Jak wskazał @MichaelMyers, użyj

javap -c <name of java class file> 

aby uzyskać kod zespołu JVM. Możesz również przekierować dane wyjściowe do pliku tekstowego, aby uzyskać lepszą widoczność.

javap -c <name of java class file> > decompiled.txt
Nilashish C.
źródło
7

Chcesz dekompilatora javy, możesz to zrobić za pomocą narzędzia wiersza poleceń javap. Ponadto Java Decompiler HOW-TO opisuje, w jaki sposób można zdekompilować plik klasy.

Drew Frezell
źródło
2

to czego szukasz to dekompilator java. Polecam JAD http://www.kpdus.com/jad.html Jest darmowy do użytku niekomercyjnego i wykonuje swoją pracę.

Uwaga: to nie sprawi, że kod będzie dokładnie taki sam, jak został napisany. tzn. stracisz komentarze i prawdopodobnie nazwy zmiennych, więc będzie to trochę trudniejsze niż zwykłe czytanie normalnego kodu źródłowego. Jeśli programista jest naprawdę tajny, zaciemni również swój kod, co będzie jeszcze trudniejsze do odczytania.

David Beleznay
źródło
2

cpuguru, jeśli twój aplet został skompilowany w javac 1.3 (lub starszym), najlepszą opcją jest użycie Jad.

Niestety, ostatnim JDK obsługiwanym przez JAD 1.5.8 (14 kwietnia 2001) jest JDK 1.3.

Jeśli twój aplet został skompilowany za pomocą nowszego kompilatora, możesz wypróbować JD-GUI : ten dekompilator jest w trakcie opracowywania, niemniej jednak generuje on poprawne źródła Javy przez większość czasu dla klas skompilowanych z JDK 1.4, 1.5 lub 1.6.

DarenW, dziękuję za twoją wiadomość. JD-GUI nie jest jeszcze najlepszym dekompilatorem ... ale pracuję nad :)

Emmanuel Dupuy
źródło
2

Używanie Jad do dekompilacji jest prawdopodobnie najlepszą opcją. Jeśli kod nie został zaciemniony, da dobry wynik.

Rasmus Faber
źródło
1

Musisz użyć dekompilatora. Inni zasugerowali JAD, są inne opcje, JAD jest najlepszy.

Powtórzę komentarze, które możesz trochę stracić w porównaniu z oryginalnym kodem źródłowym. Szczególnie zabawnie będzie wyglądać, jeśli kod użyje generycznych ze względu na wymazanie.

Zac Gochenour
źródło
1

Na pewno wtyczka JAD i / lub JADclipse Eclipse.

John Gardner
źródło
1

Jeśli plik klasy, do którego chcesz zajrzeć, jest open source, nie powinieneś go dekompilować, ale zamiast tego dołączyć pliki źródłowe bezpośrednio do swojego IDE. w ten sposób możesz po prostu przeglądać kod jakiejś klasy bibliotecznej tak, jakby był Twoją własną

arturh
źródło
0

Jak sugerowano, możesz użyć JAD do dekompilacji i przeglądania plików. Aby ułatwić czytanie, możesz użyć wtyczki JADclipse do eclipse, aby zintegrować JAD bezpośrednio z eclipse lub użyć DJ Java Decompiler, który jest znacznie łatwiejszy w użyciu niż JAD z wiersza poleceń


źródło
0

JAD to doskonała opcja, jeśli w rezultacie chcesz uzyskać czytelny kod Java. Jeśli jednak naprawdę chcesz zagłębić się w wnętrze .classformatu pliku, będziesz chciał javap. Jest dołączony do JDK i umożliwia "dekompilację" szesnastkowego kodu bajtowego do czytelnego ASCII. Język, który tworzy, nadal jest kodem bajtowym (nie jest niczym innym jak Java), ale jest dość czytelny i niezwykle pouczający.

Ponadto, jeśli naprawdę chcesz, możesz otworzyć dowolny .classplik w edytorze szesnastkowym i bezpośrednio odczytać kod bajtowy. Wynik jest identyczny jak przy użyciu javap.

Daniel Śpiewak
źródło
0

Nie ma potrzeby dekompilacji klasy Applet.class. Publiczny kod źródłowy klas Java API jest dostarczany z JDK (jeśli zdecydujesz się go zainstalować) i jest bardziej czytelny niż zdekompilowany kod bajtowy. Możesz znaleźć skompresowany plik src.zip (znajdujący się w folderze instalacyjnym JDK).

Arno
źródło