¿Cómo puedo abrir archivos .class de Java de una manera legible por humanos?

111

Estoy tratando de averiguar qué está haciendo el archivo de clase de un subprograma de Java bajo el capó. Abrirlo con Notepad o Textpad solo muestra un montón de palabrería.

¿Hay alguna forma de volver a convertirlo en un formato algo legible para que pueda intentar averiguar qué está haciendo?

  • Entorno == Windows con VS 2008 instalado.
cpuguru
fuente
7
Solo una cuestión de semántica, ¿no debería ser uno = no dos? == es una pregunta mientras que = es una declaración y usted está haciendo una declaración sobre su entorno.
icco
¿Puede aclarar esta pregunta? Mi pensamiento inmediato fue que querías leer el código de bytes real, pero parece que en realidad quieres descompilar el código de otra persona.
Programador fuera de la ley
12
@icco, = significa asignación, == significa igualdad. Él está diciendo que (Entorno == Windows con VS2008 instalado) es cierto, no dando una orden para configurar el Entorno en Windows con VS2008 instalado. Hombre que era fuera de tema y nerd.
Blorgbeard sale el
7
Para el registro == no declara igualdad; prueba la igualdad. Puede escribir verdadero == falso, y es tan significativo como escribir Entorno == Windows con VS 2008 instalado, es decir, nada significativo.
bwerks

Respuestas:

208

jd-gui es el mejor descompilador en este momento. puede manejar características más nuevas en Java, en comparación con el JAD cada vez más polvoriento.

DarenW
fuente
1
¿Qué tan actualizada está esta respuesta en 2020?
The Coding Wombat
Siempre que el enlace vaya a alguna parte, supongo que es bueno. No sabría si ahora hay un descompilador de Java mejor, ya que no he usado Java desde hace mucho tiempo.
DarenW
77

Si no le importa leer el código de bytes, javap debería funcionar bien. Es parte de la instalación estándar de JDK.

Usage: javap <options> <classes>...

where options include:
   -c                        Disassemble the code
   -classpath <pathlist>     Specify where to find user class files
   -extdirs <dirs>           Override location of installed extensions
   -help                     Print this usage message
   -J<flag>                  Pass <flag> directly to the runtime system
   -l                        Print line number and local variable tables
   -public                   Show only public classes and members
   -protected                Show protected/public classes and members
   -package                  Show package/protected/public classes
                             and members (default)
   -private                  Show all classes and members
   -s                        Print internal type signatures
   -bootclasspath <pathlist> Override location of class files loaded
                             by the bootstrap class loader
   -verbose                  Print stack size, number of locals and args for methods
                             If verifying, print reasons for failure
Michael Myers
fuente
9

Como lo señaló @MichaelMyers, use

javap -c <name of java class file> 

para obtener el código ensamblador de JVM. También puede redirigir la salida a un archivo de texto para una mejor visibilidad.

javap -c <name of java class file> > decompiled.txt
Nilashish C
fuente
7

Si desea un descompilador de Java, puede usar la herramienta de línea de comandos javappara hacer esto. Además, Java Decompiler HOW-TO describe cómo se puede descompilar un archivo de clase.

Dibujó Frezell
fuente
2

lo que busca es un de-compilador de Java. Recomiendo JAD http://www.kpdus.com/jad.html Es gratis para uso no comercial y hace el trabajo.

Nota: esto no hará que el código sea exactamente igual al que se escribió. es decir, perderá comentarios y posiblemente nombres de variables, por lo que será un poco más difícil que simplemente leer el código fuente normal. Si el desarrollador es realmente reservado, también habrá ofuscado su código, lo que hará que sea aún más difícil de leer.

David Beleznay
fuente
2

cpuguru, si su applet ha sido compilado con javac 1.3 (o menos), su mejor opción es usar Jad.

Desafortunadamente, el último JDK soportado por JAD 1.5.8 (14 de abril de 2001) es JDK 1.3.

Si su applet ha sido compilado con un compilador más reciente, puede probar JD-GUI : este descompilador está en desarrollo, sin embargo, genera fuentes Java correctas, la mayoría de las veces, para clases compiladas con los JDK 1.4, 1.5 o 1.6.

DarenW, gracias por tu publicación. JD-GUI aún no es el mejor descompilador ... pero estoy trabajando :)

Emmanuel Dupuy
fuente
2

Usar Jad para descompilarlo es probablemente su mejor opción. A menos que el código se haya ofuscado, producirá un resultado aceptable.

Rasmus Faber
fuente
1

Necesitas usar un descompilador. Otros han sugerido JAD, hay otras opciones, JAD es la mejor.

Me haré eco de los comentarios que puede perder un poco en comparación con el código fuente original. Se verá especialmente divertido si el código usa genéricos, debido al borrado.

Zac Gochenour
fuente
1

Complemento JAD y / o JADclipse Eclipse, seguro.

John Gardner
fuente
1

Si el archivo de clase que desea examinar es de código abierto, no debe descompilarlo, sino adjuntar los archivos de origen directamente en su IDE. de esa manera, puede ver el código de alguna clase de biblioteca como si fuera suyo

Arturh
fuente
0

Como se sugirió, puede usar JAD para descompilarlo y ver los archivos. Para que sea más fácil de leer, puede usar el complemento JADclipse para eclipse para integrar JAD directamente en eclipse o usar DJ Java Decompiler, que es mucho más fácil de usar que la línea de comandos JAD


fuente
0

JAD es una excelente opción si desea un código Java legible como resultado. Sin embargo, si realmente desea profundizar en los aspectos internos del .classformato de archivo, querrá javap. Se incluye con el JDK y le permite "descompilar" el código de bytes hexadecimal en ASCII legible. El lenguaje que produce sigue siendo código de bytes (nada parecido a Java), pero es bastante legible y extremadamente instructivo.

Además, si realmente lo desea, puede abrir cualquier .classarchivo en un editor hexadecimal y leer el código de bytes directamente. El resultado es idéntico a usar javap.

Daniel Spiewak
fuente
0

No es necesario descompilar Applet.class. El código fuente de las clases de API públicas de Java viene con el JDK (si elige instalarlo) y es mejor legible que el código de bytes descompilado. Puede encontrarlo comprimido en src.zip (ubicado en su carpeta de instalación de JDK).

Arno
fuente