Java 反编译器将.class
文件转换回.java
文件。虽然反编译的代码并不完美(没有注释,有时会混淆名称等),但它在黑客竞赛、释放被专有软件锁定的数据或满足好奇心时很有用。
周围有一些开源反编译器,但我对任何一个都不满意,因为我尝试过的那些在大型 Java 项目上崩溃,或者产生非最佳变量名,或者使用不符合Java 代码约定的代码格式.
反编译器应该能够理解并清楚地显示所有最近的概念(例如泛型)。
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 开源的链接。它有自己的比较页面。从页面...
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).
我使用了 Emmanuel Dupuy 的 Java Decompiler。对我来说,它是一个很好的 jar 文件反编译器。我得到了源代码。我使用windows GUI版本来反编译jar文件。
对我来说,这是一个很好的解决方案,而且速度非常快。