Descompilador de Java de código abierto que no falla en proyectos grandes, comprende conceptos avanzados de Java

Un descompilador de Java vuelve a convertir un archivo .classen un .javaarchivo. Si bien el código descompilado no es perfecto (sin comentarios, a veces nombres ofuscados, etc.), puede ser útil durante las competencias de piratería, o para liberar sus datos bloqueados por software propietario, o para satisfacer la curiosidad.

Hay algunos descompiladores de código abierto, pero ninguno me satisface, ya que los que probé colapsaron en grandes proyectos de Java, o produjeron nombres de variables no óptimos, o usaron un formato de código que no se ajusta a las convenciones de código de Java. .

El descompilador debe ser capaz de comprender y mostrar claramente todos los conceptos recientes (por ejemplo, genéricos).

Uso jad junto con el complemento de eclipse jadclipse. Ayuda a tener una idea de lo que está pasando y no debería depender del tamaño del proyecto, ya que solo descompila una sola clase.
@JensPiegsa: jad no es de código abierto y no se mantiene a pesar de los errores.
Por favor, incluya una lista de los descompiladores que consideró y por qué no están a la altura.

Respuestas (2)

Usé CFR y la salida se ve bien. Entiende genéricos, el formato es limpio. No estoy seguro si nombrar (variable local) puede ser mejor. Aquí hay un ejemplo que muestra el problema de los nombres.

Ver salida de java.util.ArrayDequeue(

private void doubleCapacity() {
        int n;
        assert (this.head == this.tail);
        int n2 = this.head;
        int n3 = this.elements.length;
        int n4 = n3 - n2;
        if ((n = n3 << 1) < 0) {
            throw new IllegalStateException("Sorry, deque too big");
        }
        Object[] arrobject = new Object[n];
        System.arraycopy(this.elements, n2, arrobject, 0, n4);
        System.arraycopy(this.elements, 0, arrobject, n4, n2);
        this.elements = arrobject;
        this.head = 0;
        this.tail = n3;
    }

Compara eso con el original

private void doubleCapacity() {
    assert head == tail;
    int p = head;
    int n = elements.length;
    int r = n - p; // number of elements to the right of p
    int newCapacity = n << 1;
    if (newCapacity < 0)
        throw new IllegalStateException("Sorry, deque too big");
    Object[] a = new Object[newCapacity];
    System.arraycopy(elements, p, a, 0, r);
    System.arraycopy(elements, 0, a, r, p);
    elements = (E[])a;
    head = 0;
    tail = n;
}

Obtener un nombre basado en el contexto estará fuera del alcance de la mayoría de los descompiladores.

El autor tiene un enlace al proyecto de sus amigos, procyon, opensource . Tiene su propia página de comparación . De la pagina...

El descompilador Procyon maneja mejoras de lenguaje de Java 5 y posteriores que la mayoría de los otros descompiladores no lo hacen. También sobresale en áreas donde otros se quedan cortos. A Procyon en particular le va bien con:

Enum declarations
Enum and String switch statements (only tested against javac 1.7 so far)
Local classes (both anonymous and named)
Annotations
Java 8 Lambdas and method references (i.e., the :: operator).
Desafortunadamente, CFR no es de código abierto :-/ Ver benf.org/other/cfr/faq.html " No voy a publicar el código fuente hasta que esté un poco más pulido ". Solo el binario está bajo licencia MIT, por lo que no es de código abierto.
La fuente ahora está publicada en GitHub .

Usé Java Decompiler de Emmanuel Dupuy . Para mí es un buen descompilador de archivos jar. Tengo el código fuente. Usé la versión GUI de Windows para descompilar el archivo jar.

  • Fácil de usar
  • Función de navegación y búsqueda
  • mostrar el árbol del proyecto jar

Para mí fue una buena solución y es muy rápido.

Gracias por el esfuerzo, pero no es de código abierto. en.wikipedia.org/wiki/Java_Decompiler
Oh, lo siento, vi tu pregunta y no consideré que necesitas una versión de código abierto.
@NicolasRaoul ¿Por qué la necesidad de código abierto si tiene un descompilador? :)