Java反编译器将.class文件转换回.java文件。虽然反编译的代码不是完美的(没有注释,有时甚至是混淆的名称等),但在黑客竞赛中,释放被专有软件锁定的数据或满足好奇心时,它可能很有用。

那里周围有几个开源反编译器,但我对此并不满意,因为我尝试在大型Java项目中崩溃,产生了非最佳变量名或使用了不符合Java代码约定的代码格式。

反编译器应该能够理解并清晰地显示所有最新概念(例如泛型)。

评论

我将jad与eclipse插件jadclipse一起使用。它有助于了解正在发生的事情,并且不应依赖于项目规模,因为它仅反编译单个类。

@JensPiegsa:jad不是开源的,尽管存在错误也无法维护。

请提供您考虑过的编译器列表,以及为什么它们达不到要求。

#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