2011-10-24 15 views
8

Sé que esta pregunta ya se había hecho hace millones de veces, pero estoy específicamente después de un descompilador que manejaría enums corrently (porque el jar que estoy descompilando utiliza enumeraciones fuertemente). Probé que tanto JAD como JD-GUI no.Descompilador de Java que funciona con Java 5 (maneja enumeraciones entre otras cosas nuevas)

¿Podría alguien recomendar un descompilador (lo ideal es que funcione en Linux y pueda manejar fácilmente todo el contenedor sin necesidad de que escriba scripts de shell)?

EDIT: Específicamente tengo problemas con construcciones como:

switch(myEnum) { 
case A: ... 
case B: ... 
} 

consiguen decompilados (tanto para JAD y JD-GUI) como algo parecido a:

switch ($SWITCH_TABLE$com$MyType()[myEnum.ordinal()]) { 
case 1: 
case 2: 
} 

donde $SWITCH_TABLE$com$MyType() es o no declarado en absoluto o no compila.

+0

posible duplicado de [¿Dónde puedo encontrar un descompilador Java?] (Http://stackoverflow.com/questions/671394/where-can-i-find-a-java-decompiler) –

+1

Según la pregunta que he vinculado arriba http://java.decompiler.free.fr/ proporciona la mejor para Java 5. Si esto no funciona para usted, entonces díganos * cómo * no ayuda. –

+0

No sé sobre JD-GUI pero estamos usando JD-Eclipse que usa una versión anterior de JD-Core que hace JD-GUI, y también maneja enums. – Thomas

Respuesta

2

No es posible descompilar un enum-switch correctamente. El java-classfile no sabe acerca del enum-Typ después de la compilación, por lo tanto, su descompilador no puede descompilarlo a su gusto.

Enumeraciones-Los tipos son todos un subtipo de java.lang.Enum, cada constante enum tiene un número ordinal que se utiliza en una declaración de cambio. El compilador hace un cambio en ese valor int, un cambio sobre un tipo enum simplemente se dice azúcar sintáctico. Si intentas activar un null -enum obtendrás un NPE.

+0

Depende de lo inteligente que es el decompilador, supongo. Si es capaz de encontrar la declaración de la enumeración, entonces debería poder asignar los números ordinales a los nombres. – Grzenio

+0

Si descompilo la versión $ 1 de un archivo de clase que enciende un ENUM, obtengo una lista de todos los ordinales junto con las constantes ENUM. Será posible descompilar esto, solo necesita codificación. Desafortunadamente, no parece que JD-Java Decompiler sea de código abierto :-(y JAD es demasiado viejo para ponerse al día con todo lo demás sin grandes esfuerzos. – mjaggard

2

He encontrado que el producto de un proyecto de investigación, CFR, maneja Enums particularmente bien.

Como en este momento, JD-GUI y JAD no funcionan mejor que cuando se publicó la pregunta del OP, mientras que la versión 0.43 de CFR genera una fuente correcta y compilable, incluso cuando se suministran clases ofuscadas.

Cuestiones relacionadas