¿Es posible convertir un archivo .class
en el archivo .java
?Código de bytes al código fuente de Java
¿Cómo se puede hacer esto?
¿Qué ocurre con la corrección del código extraído de esta opción?
¿Es posible convertir un archivo .class
en el archivo .java
?Código de bytes al código fuente de Java
¿Cómo se puede hacer esto?
¿Qué ocurre con la corrección del código extraído de esta opción?
Es posible. Necesita un Descompilador Java para hacer esto.
En su mayoría, hará un trabajo sorprendentemente bueno. Lo que obtendrá es un archivo válido .java
que se compilará en el archivo .class
, pero este archivo .java
no será necesariamente el mismo que el código fuente original. Cosas como construcciones de bucle pueden aparecer de forma diferente, y todo lo que sea tiempo de compilación solo como genéricos y anotaciones no se volverá a crear.
Puede tener un problema si the code has been obfuscated. Este es un proceso que altera los archivos de clase para hacerlos difíciles de descompilar. Por ejemplo, los nombres de clase y de variable se cambian para que todos sean similares, por lo que terminará con un código como aa.a(ab)
en lugar de employee.setName(name)
y es muy difícil averiguar lo que está sucediendo.
Recuerdo usar JAD para hacer esto pero no creo que esto se mantenga activamente así que puede no funcionar con versiones nunca de Java. Un Google search for java decompiler le dará muchas opciones.
Sí, intente JAD Java Decompiler
Es posible, pero el código que obtendrá puede ser incorrecto. Sin embargo, busque algunos decompiladores de Java.
Siempre es posible. Busque "java disassembler".
Pero los comentarios del código fuente y las variables temporales no estarán disponibles.
Si descompila una clase y ve el código es demasiado complejo con los nombres de las variables y los nombres de los métodos son como a, b, c ... eso significa que el proyecto está ofuscado.
Esto es posible utilizando uno de los Java decompilers disponibles. Dado que está trabajando desde un código de bytes que puede haber sido optimizado por el compilador (alineando variables estáticas, reestructurando el flujo de control, etc.), lo que obtiene puede no ser exactamente igual que el código que se compiló originalmente pero que será funcionalmente equivalente.
No es exactamente un decompilador, pero el JDK contains javap, a disassembler:
javap -c org.example.MyClass
Dependiendo de su caso de uso, que todavía puede ser interesante conocer o utilizar.
Tenga en cuenta que los resultados de la descompilación de archivos de clase dependen de la información incluida en un archivo de clase. Si mal no recuerdo, la información de depuración incluida (see -g flag of javac) es importante, especialmente para nombrar variables y cosas por el estilo.
He estado usando JAD, pero más tarde cambió a otro, que en mi opinión es mejor - here
DJ es la fácil de usar java decompiler. Simplemente abra cualquier archivo .class y le mostrará su código java
.
Además, se puede utilizar jadClipse plug-in para Eclipse para descompilar directamente el .class en .java
What about the correctness of the code extracted from this option?
En cualquier caso, el código que se genera por cualquier decompilador java no será el mismo que se fue escrito en la clase original de Java. Como solo decodifica el bytecode en código java. De lo único que puede estar seguro es de que la salida será la misma que la salida del código original de Java.
+1 para la salida será igual a la salida del código original de Java –
Agregando a las respuestas anteriores: recientemente, una nueva ola de descompiladores ha estado viniendo, a saber Procyon, CFR, JD, Fernflower
He aquí una lista de descompiladores modernos a partir de marzo de 2015:
Puede probar los decompiladores mencionados anteriormente en línea, no requiere instalación y haga su propia elección educada. Descompiladores de Java en la nube:http://www.javadecompilers.com/
Creo que no está garantizado que SIEMPRE sea posible. Creo que hay algunos constructos de bytecode que no tienen equivalente en Java, también algunos lenguajes/herramientas que gencran .class de otras fuentes (Scala ...). –
Gracioso ... Estamos hablando de Java y bytecode aquí. – JCasso
yo también ... pero OP no ha mencionado que la clase .class fue creada (directamente) desde Java. Y gracias ... –