开源Java反编译器不会在大型项目上崩溃,了解高级Java概念

软件推荐 软件开发 爪哇 开源的 反编译器
2021-11-04 01:19:28

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

周围有一些开源反编译器,但我对任何一个都不满意,因为我尝试过的那些在大型 Java 项目上崩溃,或者产生非最佳变量名,或者使用不符合Java 代码约定的代码格式.

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

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 开源的链接。它有自己的比较页面从页面...

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文件。

  • 使用方便
  • 导航和搜索功能
  • 显示 jar 项目的树

对我来说,这是一个很好的解决方案,而且速度非常快。