Come posso aprire file Java .class in modo leggibile dall'uomo?


111

Sto cercando di capire cosa sta facendo il file di classe di un'applet Java sotto il cofano. Aprirlo con Blocco note o Blocco testo mostra solo un mucchio di gobbledy-gook.

C'è un modo per rimetterlo in un formato un po 'leggibile in modo da poter provare a capire cosa sta facendo?

  • Ambiente == Windows con VS 2008 installato.

7
Solo una questione semantica, non dovrebbe essere uno = non due? == è una domanda mentre = è un'affermazione e stai facendo un'affermazione sul tuo ambiente.
icco

Puoi chiarire questa domanda? Il mio pensiero immediato è stato che volessi leggere il bytecode effettivo, ma sembra che tu voglia effettivamente decompilare il codice di qualcun altro.
Programmatore fuorilegge

12
@icco, = significa assegnazione, == significa uguaglianza. Sta dicendo che (Ambiente == Windows con installato VS2008) è vero, non dando un ordine per impostare Ambiente su Windows con installato VS2008. Un uomo fuori tema e nerd.
Blorgbeard uscirà il

7
Per la cronaca == non dichiara l'uguaglianza; verifica l'uguaglianza. Puoi scrivere true == false, ed è significativo quanto scrivere Environment == Windows con VS 2008 installato, cioè non ha alcun significato.
bwerks

Risposte:


208

jd-gui è il miglior decompilatore al momento. può gestire le nuove funzionalità in Java, rispetto al sempre più polveroso JAD.


1
Quanto è aggiornata questa risposta nel 2020?
The Coding Wombat

Finché il collegamento va da qualche parte, suppongo sia buono. Non saprei se ora esiste un decompilatore Java migliore, poiché non ho usato Java da molto tempo.
DarenW

77

Se non ti dispiace leggere bytecode, javap dovrebbe funzionare bene. Fa parte dell'installazione JDK standard.

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

Come sottolineato da @MichaelMyers, usa

javap -c <name of java class file> 

per ottenere il codice assembly JVM. Puoi anche reindirizzare l'output a un file di testo per una migliore visibilità.

javap -c <name of java class file> > decompiled.txt


2

quello che stai cercando è un de-compilatore java. Raccomando JAD http://www.kpdus.com/jad.html È gratuito per uso non commerciale e fa il suo lavoro.

Nota: questo non renderà il codice esattamente uguale a quello che è stato scritto. cioè perderai commenti e possibilmente nomi di variabili, quindi sarà un po 'più difficile che leggere il normale codice sorgente. Se lo sviluppatore è davvero riservato, avrà offuscato anche il suo codice, rendendolo ancora più difficile da leggere.


2

cpuguru, se la tua applet è stata compilata con javac 1.3 (o meno), l'opzione migliore è usare Jad.

Sfortunatamente, l'ultimo JDK supportato da JAD 1.5.8 (14 aprile 2001) è JDK 1.3.

Se la tua applet è stata compilata con un compilatore più recente, potresti provare JD-GUI : questo decompilatore è in fase di sviluppo, tuttavia genera i sorgenti Java corretti, il più delle volte, per le classi compilate con i JDK 1.4, 1.5 o 1.6.

DarenW, grazie per il tuo post. JD-GUI non è ancora il miglior decompilatore ... ma ci sto lavorando :)



2

Usare Jad per decompilare è probabilmente la tua migliore opzione. A meno che il codice non sia stato offuscato, produrrà un risultato corretto.



1

Devi usare un decompilatore. Altri hanno suggerito JAD, ci sono altre opzioni, JAD è il migliore.

Faccio eco ai commenti che potresti perdere un po 'rispetto al codice sorgente originale. Sembrerà particolarmente divertente se il codice utilizza generici, a causa della cancellazione.



1

Se il file di classe che desideri esaminare è open source, non dovresti decompilarlo, ma allegare invece i file sorgente direttamente nel tuo IDE. in questo modo, puoi semplicemente visualizzare il codice di una classe di libreria come se fosse il tuo


0

Come suggerito puoi usare JAD per decompilarlo e visualizzare i file. Per semplificare la lettura puoi utilizzare il plug-in JADclipse per eclipse per integrare JAD direttamente in eclipse o utilizzare DJ Java Decompiler che è molto più facile da usare rispetto a JAD a riga di comando


0

JAD è un'opzione eccellente se desideri un codice Java leggibile come risultato. Se vuoi davvero approfondire le parti interne del .classformato del file, lo vorrai javap. È fornito in bundle con JDK e consente di "decompilare" il bytecode esadecimale in ASCII leggibile. Il linguaggio che produce è ancora bytecode (non qualcosa come Java), ma è abbastanza leggibile ed estremamente istruttivo.

Inoltre, se si veramente desidera, è possibile aprire qualsiasi .classfile in un editor esadecimale e leggere direttamente il bytecode. Il risultato è identico all'utilizzo javap.


0

Non è necessario decompilare Applet.class. Il codice sorgente delle classi API Java pubbliche viene fornito con JDK (se si sceglie di installarlo) ed è meglio leggibile del bytecode decompilato. Puoi trovarlo compresso in src.zip (situato nella cartella di installazione di JDK).



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.