¿Cómo puedo "descompilar" archivos de clase Java? [cerrado]


¿Qué programa puedo usar para descompilar un archivo de clase? ¿Realmente obtendré código Java, o es solo código ensamblador JVM?

En las preguntas de rendimiento de Java en este sitio a menudo veo respuestas de personas que han "descompilado" el archivo de clase Java para ver cómo el compilador optimiza ciertas cosas.

Author: Peter Mortensen, 2008-11-07

19 answers

Actualización de febrero de 2016:

Www.javadecompilers.com enumera a JAD como:

El decompilador Java más popular, pero principalmente de esta era solamente. Escrito en C++, muy rápido.
Obsoleto, no soportado y no descompila correctamente Java 5 y posteriores

Así que su kilometraje puede variar con jdk reciente (7, 8).

El mismo sitio lista otras herramientas.

Y javadecompiler, como señala Salvador Valencia en los comentarios (Sept 2017), ofrece un SaaS donde subes el archivo .class a la nube y te devuelve el código descompilado.


Respuesta original: Oct. 2008

  • La versión final de JSR 176, que define las principales características de J2SE 5.0 (Java SE 5), se publicó el 30 de septiembre de 2004.
  • La última versión de Java soportada por JAD, el famoso descompilador de Java escrito por Pavel Kouznetsov, es JDK 1.3.
  • La mayoría de los descompiladores Java descargables hoy desde Internet, como "DJ Java Decompiler" o "Cavaj Java Decompiler", son alimentados por JAD: no pueden mostrar fuentes Java 5.

Java Decompiler (Otro rápido decompiler Java) tiene:

  • Soporte explícito para descompilar y analizar Java 5 + ".archivos de clase".
  • Una GUI agradable:

pantallazo

Funciona con compiladores desde JDK 1.1.8 hasta JDK 1.7.0, y otros ( Jikes , JRockit , etc.).

Cuenta con una versión de demostración en línea en vivo que en realidad es completamente funcional! Simplemente puede soltar un archivo jar en la página y ver el código fuente descompilado sin instalar nada.

 588
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-15 21:45:21

Hay algunos descompiladores por ahí... Una búsqueda rápida produce:

  1. Procyon : código abierto (Apache 2) y desarrollado activamente
  2. Krakatau : código abierto (GPLv3) y desarrollado activamente
  3. CFR : código abierto (MIT) y desarrollado activamente
  4. JAD
  5. DJ Java Decompiler
  6. Mocha

Y muchos más.

Estos producen código Java. Java viene con algo que te permite véase el código de bytes JVM (javap).

 101
Author: billjamesdev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-07 15:39:35

Para ver el código fuente de Java, compruebe algún descompilador. Busca jad .

Si desea ver bytecodes, simplemente use javap que viene con el JDK.

 51
Author: Marko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-07 16:03:51

Probé varios, y Procyon parecía funcionar mejor para mí. Está en desarrollo activo y es compatible con muchas características de las últimas versiones de Java.

Estos son los otros que probé:

  • CFR
    • Promising, but often failed method decompilation. Voy a mantener mi ojo en este. También desarrollado activamente con soporte para las últimas características de Java.
  • Krakatau
    • Adopta un enfoque diferente en que intenta generar código Java equivalente en lugar de intentar reconstruir la fuente original, lo que tiene el potencial de hacerlo mejor para el código ofuscado. De mis pruebas fue aproximadamente a la par con Procyon, pero aún así es bueno tener algo diferente. Tuve que usar el indicador de línea de comandos -skip para que no se detuviera en los errores. Desarrollado activamente, y curiosamente está escrito en Python.
  • JD-GUI
    • Funcionó, pero la producción de Procyon fue mucho mejor. Aquí hay una página que compara la salida de Procyon con la original y JD-GUI. JD-GUI también está disponible como un complemento de Eclipse , que no funcionó para mí en absoluto. No parece ser de código abierto y el desarrollo parece esporádico.
  • JAD
    • Funcionó, pero solo soporta Java 1.4 y versiones anteriores. También disponible como complemento para Eclipse . Ya no está en desarrollo.
 29
Author: bmaupin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-22 16:00:27

Uso JAD Decompiler.

Hay un complemento Eclipse para ello, jadeclipse. Es bastante agradable.

 18
Author: sakana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-15 13:21:08

Procyon incluye un descompilador. Es FOSS.

 14
Author: Janus Troelsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-10 14:02:51

Hollín es una opción para código Java más reciente. Al menos tiene la ventaja de que todavía se mantiene recientemente...

También, Descompilador de Java es un descompilador con una interfaz gráfica de usuario independiente y la integración de Eclipse.

Por último, Jdec no se ha mencionado, aunque no es tan pulido como otras opciones.

 13
Author: Quinn Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-18 23:59:11

JD-GUI es realmente bueno. Simplemente puede abrir un archivo JAR y navegar por el código como si estás trabajando en un IDE. Buen material.

 13
Author: G Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-23 16:38:21

Aquí hay una lista de descompiladores a partir de febrero de 2015:

Procyon, open-source, https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler

CFR , libre, sin código fuente disponible, http://www.benf.org/other/cfr /

JD , solo para uso no comercial, http://jd.benow.ca /

Fernflower, open-source, https://github.com/fesh0r/fernflower,

JAD - dado aquí solamente por razones históricas. Libre, no hay código fuente disponible, http://varaneckas.com/jad / Obsoleto, no soportado y no descompila correctamente Java 5 y versiones posteriores.

Puede probar los decompilers mencionados anteriormente en línea, sin necesidad de instalación y hacer su propia elección educada.

Descompiladores Java en la nube: http://www.javadecompilers.com /

 11
Author: Andrew Rukin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-24 11:19:51

Hay algunos programas que puede utilizar. Obtendrá el código Java real, pero a veces el código habrá sido ofuscado por lo que los métodos se nombran por una letra o número o una mezcla aleatoria de letras y números.

DJ Decompiler Mocha

 10
Author: Mike Pone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-19 18:21:45

La mayoría de los descompiladores para Java están basados en JAD. Es una gran herramienta, pero desafortunadamente no se ha actualizado durante un tiempo y no maneja muy bien las clases Java 1.5+. No he visto ninguna herramienta que maneje correctamente las clases 1.5+.

 9
Author: John Meagher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-07 16:18:26

Echa un vistazo a cavaj.

 6
Author: Paulo Guedes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-07 16:02:55

Todos los enlaces JAD listados hasta ahora parecen estar rotos, así que encontré este sitio. Funciona muy bien (para Linux, al menos)! En Ubuntu 11.10 tuve que descargar el estático por cualquier razón.

Http://www.varaneckas.com/jad

 6
Author: kdazzle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-04 03:11:15
  • JAD es uno que funciona y es simple.

  • Además, si solo quieres ver los métodos, usa javap.

 5
Author: Berlin Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-13 05:41:45

Si quieres ver cómo el compilador Java hace ciertas cosas, no quieres descompilar, quieres desensamblar. La descompilación implica transformar el bytecode en código fuente Java, lo que significa que se pierde mucha información de bajo nivel, y si te estás preguntando sobre la optimización del compilador, esta es probablemente la misma información que te interesa.

De todos modos, resulta que he escrito un desensamblador Java de código abierto. A diferencia de Javap, esto funciona incluso en casos altamente patológicos clases, para que pueda ver lo que las herramientas de ofuscación están haciendo a sus clases también. También puede hacer descompilación, aunque no lo recomendaría.

 5
Author: Antimony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-30 03:13:59

JAD no funciona para mí (problema de Ubuntu 11.10), así que me he movido hacia adelante y he sopped en JODO. Al menos tiene código fuente Java abierto y ha sido capaz de descompilar mi .class correctamente.

Recomiendo revisar 'branches/generic' branch primero. El tronco no es estable.

 4
Author: alexander.box,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-25 17:52:07

En la plataforma IntelliJ IDEA puede utilizar Java Decompiler IntelliJ Plugin. Le permite mostrar todas las fuentes Java durante su proceso de depuración, incluso si no las tiene todas. Se basa en las famosas herramientas JD-GUI.

introduzca la descripción de la imagen aquí

 4
Author: naXa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-23 08:36:03

Con AndroChef Java Decompiler puedes descompilar archivos de clase apk, dex, jar y java. Es simple y fácil. AndroChef JD está basado en FernFlower . Puede evaluarlo en 10 usos gratuitos.

AndroChef soporta características del lenguaje Java como genéricos, enumeraciones y anotaciones. Según algunos estudios, AndroChef Java Decompiler es capaz de descompilar el 98.04% de las aplicaciones Java generadas con compiladores Java tradicionales, una tasa de recuperación muy alta. Es simple pero potente herramienta que le permite descompilar Java y Dalvik bytecode (DEX, APK) en código Java legible.

 1
Author: naXa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-23 08:44:20

Para OSX recomiendo: jarzilla o JD-GUI

Ambos te permiten ver jar, war, etc. contenido del archivo y descompila cualquier archivo de clase dentro de ellos.

Jarzilla: https://code.google.com/p/jarzilla /
JD-GUI: http://jd.benow.ca /

 1
Author: cjackson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-02 16:01:12