Декомпилятор Java превращает .class
файл обратно в .java
файл. Хотя декомпилированный код не идеален (отсутствие комментариев, иногда запутанные имена и т. д.), он может быть полезен во время соревнований по хакерству, или для освобождения ваших данных, заблокированных проприетарным программным обеспечением, или для удовлетворения любопытства.
Есть несколько декомпиляторов с открытым исходным кодом, но я не очень доволен ни одним из них, так как те, которые я пробовал, давали сбой в огромных проектах Java, или создавали неоптимальные имена переменных, или использовали форматирование кода, которое не соответствует соглашениям о коде Java . .
Декомпилятор должен уметь понимать и четко отображать все последние концепции (например, дженерики).
Я использовал 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).
Я использовал декомпилятор Java от Emmanuel Dupuy . Для меня это хороший декомпилятор файлов jar. Я получил исходный код. Я использовал версию графического интерфейса Windows для декомпиляции файла jar.
Для меня это было хорошим решением, и это очень быстро.
Йенс Пьегса
Николя Рауль
Джаян