È possibile convertire un file .class
nel file .java
?Codice byte al codice sorgente Java
Come si può fare?
E la correttezza del codice estratto da questa opzione?
È possibile convertire un file .class
nel file .java
?Codice byte al codice sorgente Java
Come si può fare?
E la correttezza del codice estratto da questa opzione?
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.
Sì, provare JAD Java Decompiler
È possibile, ma il codice che si ottiene può essere errato. Cerca però alcuni decompilatori Java.
È 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.
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.
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.
ho utilizzato JAD, ma poi passato a un altro, che a mio parere è meglio - here
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.
+1 per l'output sarà uguale all'output del codice java originale –
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:
È 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/
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 ...). –
Divertente ... Stiamo parlando di Java e del bytecode qui. – JCasso
quindi ... ma OP non ha menzionato che la classe .class è stata creata (direttamente) da Java. E grazie ... –