2009-12-02 16 views

risposta

16

E 'possibile. Hai bisogno di un decompilatore Java per farlo.

Troverete soprattutto che farà un lavoro sorprendentemente buono. Quello che otterrete è un file .java valido che verrà compilato nel file .class ma questo file .java non sarà necessariamente uguale al codice sorgente originale. Cose come i costrutti di loop potrebbero venire fuori in modo diverso, e tutto ciò che è tempo di compilazione solo come generici e annotazioni non verrà ricreato.

Si potrebbe avere un problema se the code has been obfuscated. Questo è un processo che altera i file di classe per renderli difficili da decompilare. Ad esempio, i nomi di classi e variabili vengono modificati in modo che siano tutti simili, quindi ti ritroverai con codice come aa.a(ab) anziché employee.setName(name) ed è molto difficile capire cosa sta succedendo.

Ricordo di aver usato JAD per fare questo, ma non penso che questo sia mantenuto attivamente, quindi potrebbe non funzionare con mai versioni di Java. A Google search for java decompiler ti daranno un sacco di opzioni.

0

È possibile, ma il codice che si ottiene può essere errato. Cerca però alcuni decompilatori Java.

0

È sempre possibile. Cerca "java disassembler".

Ma i commenti del codice sorgente e le variabili temporanee non saranno disponibili.

Se decompilate una classe e vedete che il codice è troppo complesso con nomi di variabili e nomi di metodi come a, b, c ... significa che il progetto è offuscato.

+0

Penso che non sia garantito che sia SEMPRE possibile. Penso che ci siano alcuni costrutti bytecode che non hanno equivalenti in Java, anche alcuni linguaggi/strumenti che generano .class da altre fonti (Scala ...). –

+1

Divertente ... Stiamo parlando di Java e del bytecode qui. – JCasso

+0

quindi ... ma OP non ha menzionato che la classe .class è stata creata (direttamente) da Java. E grazie ... –

1

Questo è possibile utilizzando uno degli Java decompilers disponibili. Dato che si sta lavorando da un codice byte che potrebbe essere stato ottimizzato dal compilatore (inlining variabili statiche, ristrutturazione del flusso di controllo, ecc.), Ciò che si ottiene potrebbe non essere esattamente uguale al codice che era stato originariamente compilato ma funzionalmente equivalente.

0

Non esattamente un decompilatore, ma il JDK contains javap, a disassembler:

javap -c org.example.MyClass 

A seconda del caso d'uso, potrebbe essere comunque interessante conoscere o utilizzare.

Si noti che i risultati della decompilazione dei file di classe dipendono dalle informazioni incluse in un file di classe. Se ricordo bene, le informazioni di debug incluse (see -g flag of javac) sono importanti, specialmente per la denominazione di variabili e simili.

0

ho utilizzato JAD, ma poi passato a un altro, che a mio parere è meglio - here

0

DJ è il facile da usare Java decompiler. Basta aprire qualsiasi file .class e ti mostrerà il suo codice java.

Inoltre, è possibile utilizzare jadClipse plug-in per Eclipse per direttamente decompilare il .class in .java

What about the correctness of the code extracted from this option?
In ogni caso, il codice che viene generato da qualsiasi decompilatore Java non sarà lo stesso di è stato scritto in originale classe java. Come decodifica semplicemente il bytecode nel codice java. L'unica cosa che si può essere certi è che l'output sarà lo stesso dell'output del codice java originale.

+0

+1 per l'output sarà uguale all'output del codice java originale –

1

Aggiungendo alle risposte precedenti: di recente, una nuova ondata di decompilers è venuta, cioè Procyon, CFR, JD, Fernflower

Ecco un elenco dei decompilatori moderni a partire da marzo, 2015:

  • Procyon
  • CFR
  • JD
  • Fernflower

È possibile testare i decompilatori sopra menzionati online, non è necessaria alcuna installazione e fare la propria scelta istruita. Decompilatori Java nel cloud:http://www.javadecompilers.com/