.class
文件转换回.java
文件。虽然反编译的代码不是完美的(没有注释,有时甚至是混淆的名称等),但在黑客竞赛中,释放被专有软件锁定的数据或满足好奇心时,它可能很有用。那里周围有几个开源反编译器,但我对此并不满意,因为我尝试在大型Java项目中崩溃,产生了非最佳变量名或使用了不符合Java代码约定的代码格式。
反编译器应该能够理解并清晰地显示所有最新概念(例如泛型)。
#1 楼
我使用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).
评论
不幸的是,CFR并不是开源的:-/参见benf.org/other/cfr/faq.html“直到更加完善为止,我不会公开源代码”。只有二进制文件在MIT许可下,因此它不是开源的。
–尼古拉斯·拉乌尔(Nicolas Raoul)♦
17-4-28的3:19
现在该资源已发布在GitHub上。
–seanf
19-10-16在5:51
#2 楼
我使用了Emmanuel Dupuy的Java Decompiler。对我来说,它是jar文件的不错的反编译器。我得到了源代码。我使用Windows GUI版本反编译jar文件。易于使用
导航和搜索功能
显示jar项目的树
对我来说这是一个很好的解决方案,而且很快。
评论
感谢您的努力,但它不是开源的。 zh.wikipedia.org/wiki/Java_Decompiler
–尼古拉斯·拉乌尔(Nicolas Raoul)♦
2014年2月8日在12:28
抱歉,我看到了您的问题,并不认为您需要一个开源版本。
– Irgendwie指针
2014年2月9日在8:47
@NicolasRaoul如果您有反编译器,为什么需要开源? :)
– Drux
14年4月13日在12:21
评论
我将jad与eclipse插件jadclipse一起使用。它有助于了解正在发生的事情,并且不应依赖于项目规模,因为它仅反编译单个类。@JensPiegsa:jad不是开源的,尽管存在错误也无法维护。
请提供您考虑过的编译器列表,以及为什么它们达不到要求。