Декомпилятор Java с открытым исходным кодом, который не дает сбоев при больших проектах, понимает расширенные концепции Java.

Декомпилятор Java превращает .classфайл обратно в .javaфайл. Хотя декомпилированный код не идеален (отсутствие комментариев, иногда запутанные имена и т. д.), он может быть полезен во время соревнований по хакерству, или для освобождения ваших данных, заблокированных проприетарным программным обеспечением, или для удовлетворения любопытства.

Есть несколько декомпиляторов с открытым исходным кодом, но я не очень доволен ни одним из них, так как те, которые я пробовал, давали сбой в огромных проектах Java, или создавали неоптимальные имена переменных, или использовали форматирование кода, которое не соответствует соглашениям о коде Java . .

Декомпилятор должен уметь понимать и четко отображать все последние концепции (например, дженерики).

Я использую jad вместе с плагином eclipse jadclipse. Это помогает получить представление о том, что происходит, и не должно зависеть от размера проекта, поскольку декомпилирует только один класс.
@JensPiegsa: jad не имеет открытого исходного кода и не поддерживается, несмотря на ошибки.
Пожалуйста, включите список декомпиляторов, которые вы рассматривали, и почему они не на должном уровне.

Ответы (2)

Я использовал CFR , и результат выглядит хорошо. Он понимает дженерики, форматирование чистое. Не уверен, что именование (локальная переменная) может быть лучше. Вот пример, который показывает проблему именования.

См. вывод из 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;
    }

Сравните это с оригиналом

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;
}

Получение имени на основе контекста недоступно большинству декомпиляторов.

У автора есть ссылка на проект его друзей, procyon, opensource . У него есть собственная страница сравнения . Со страницы...

Декомпилятор Procyon поддерживает усовершенствования языка из Java 5 и более поздних версий, которых нет в большинстве других декомпиляторов. Он также преуспевает в тех областях, где другие терпят неудачу. В частности, Procyon хорошо справляется с:

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).
К сожалению, CFR не является открытым исходным кодом :-/ См. benf.org/other/cfr/faq.html « Я не собираюсь публиковать исходный код, пока он не будет немного отполирован ». Только двоичный файл находится под лицензией MIT, поэтому он не является открытым исходным кодом.
Исходник теперь опубликован на GitHub .

Я использовал декомпилятор Java от Emmanuel Dupuy . Для меня это хороший декомпилятор файлов jar. Я получил исходный код. Я использовал версию графического интерфейса Windows для декомпиляции файла jar.

  • Легко использовать
  • Функция навигации и поиска
  • показать дерево проекта jar

Для меня это было хорошим решением, и это очень быстро.

Спасибо за усилия, но это не с открытым исходным кодом. en.wikipedia.org/wiki/Java_Decompiler
Ой, извините, я увидел ваш вопрос и не подумал, что вам нужна версия с открытым исходным кодом.
@NicolasRaoul Зачем нужен открытый исходный код, если у вас есть декомпилятор? :)