2009-12-02 20 views

Respuesta

16

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.

0

Es posible, pero el código que obtendrá puede ser incorrecto. Sin embargo, busque algunos decompiladores de Java.

0

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.

+0

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 ...). –

+1

Gracioso ... Estamos hablando de Java y bytecode aquí. – JCasso

+0

yo también ... pero OP no ha mencionado que la clase .class fue creada (directamente) desde Java. Y gracias ... –

1

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.

0

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.

0

He estado usando JAD, pero más tarde cambió a otro, que en mi opinión es mejor - here

0

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.

+0

+1 para la salida será igual a la salida del código original de Java –

1

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:

  • Procyon
  • CFR
  • JD
  • Fernflower

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/

Cuestiones relacionadas