lunes, 30 de marzo de 2009

Decompilación de clases Java

Desde hace muchos años, para decompilar clases Java, el mejor decompilador Java ha sido jad bién usado desde consola o a través de alguna de interfície gráfica como por ejemplo DJ JAVA.

Jad hace ya tiempo que no se mantiene, incluso su sitio web no funciona (el que está enlazada es un backup creado por Tomas Varaneckas). Por suerte un digno rival apareció en escena hace ya algún tiempo, JD-Core. Su soporte a las nueva sintaxis aparecida en JavaSE 5 es mucho mejor, además de incluir por defecto una interface gráfica JD-GUI y un plugin para eclipse JD-Eclipse, observad este pequeño ejemplo:

Código Original:

import java.util.EnumSet;
import java.util.Iterator;

public enum LogEnum {
SEVERE,
WARNING,
INFO,
CONFIG,
FINE,
FINER,
FINEST;

public static void main(String[]args){
for(LogEnum l: EnumSet.allOf(LogEnum.class)){
System.out.println(l);
}

for (Iterator it=EnumSet.allOf(LogEnum.class).iterator();it.hasNext();){
System.out.println(it.next());
}
}
}


Código decompilado con jad desde consola

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: LogEnum.java

import java.io.PrintStream;
import java.util.EnumSet;
import java.util.Iterator;

public final class LogEnum extends Enum
{

private LogEnum(String s, int i)
{
super(s, i);
}

public static void main(String args[])
{
LogEnum l;
for(Iterator iterator = EnumSet.allOf(LogEnum).iterator(); iterator.hasNext(); System.out.println(l))
l = (LogEnum)iterator.next();

for(Iterator it = EnumSet.allOf(LogEnum).iterator(); it.hasNext(); System.out.println(it.next()));
}

public static LogEnum[] values()
{
LogEnum alogenum[];
int i;
LogEnum alogenum1[];
System.arraycopy(alogenum = ENUM$VALUES, 0, alogenum1 = new LogEnum[i = alogenum.length], 0, i);
return alogenum1;
}

public static LogEnum valueOf(String s)
{
return (LogEnum)Enum.valueOf(LogEnum, s);
}

public static final LogEnum SEVERE;
public static final LogEnum WARNING;
public static final LogEnum INFO;
public static final LogEnum CONFIG;
public static final LogEnum FINE;
public static final LogEnum FINER;
public static final LogEnum FINEST;
private static final LogEnum ENUM$VALUES[];

static
{
SEVERE = new LogEnum("SEVERE", 0);
WARNING = new LogEnum("WARNING", 1);
INFO = new LogEnum("INFO", 2);
CONFIG = new LogEnum("CONFIG", 3);
FINE = new LogEnum("FINE", 4);
FINER = new LogEnum("FINER", 5);
FINEST = new LogEnum("FINEST", 6);
ENUM$VALUES = (new LogEnum[] {
SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST
});
}
}


Código decompilado con JD-GUI

import java.io.PrintStream;
import java.util.EnumSet;
import java.util.Iterator;

public enum LogEnum
{
SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST;

public static void main(String[] args)
{
for (LogEnum l : EnumSet.allOf(LogEnum.class)) {
System.out.println(l);
}

for (Iterator it = EnumSet.allOf(LogEnum.class).iterator(); it.hasNext(); )
System.out.println(it.next());
}
}

4 comentarios:

Roc dijo...

Genial!

Buscava una alternativa al DJ de sempre, i em sonava aquest post... li he donat una oportunitat al soft que proposes i m'he endut una dolça sorpresa, és genial. Només fent un drag&drop d'un .class m'ha generat tota la estructura de packages de tot el projecte.

Salutacions i gràcies!
Roc Boronat

Jordi Domingo dijo...

Me n'alegro Roc!!

Fins aviat :-)

Jordi

Remy LeBeau dijo...

Por mas que busco no encuentro este soft en la web, todavia sigue vivo?

Jordi Domingo dijo...

http://jd.benow.ca/