Java反编译工具推荐-Bytecode Viewer

语法糖

Java语言设计者为了在工程上提高开发效率,设计了很多语法糖。
Java反编译工具可以反编译class文件或jar包文件,得到Java源代码。
只是,有时候我们需要得到包含语法糖的代码,有时候,需要“剥开”语法糖的代码。
比如,需要了解代码的业务逻辑是,带糖的代码更易读;我们在研究Java编译逻辑时,需要不带糖的代码,看看这些糖到底隐藏了什么。

Fernflower

IDEA 一般会默认安装插件Java Bytecode Decompiler.这个插件使用了Java反编译工具Fernflower,而Fernflower反编译后源代码很多是包含语法糖的。
enum是Java的一个语法糖,这里以其为例,看一下效果:

1
2
3
4
public enum Sex {
MALE,
FEMALE;
}

查看class文件,和源代码基本没有差异

1
2
3
4
5
6
7
8
9
10
11
12
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

public enum Sex {
MALE,
FEMALE;

private Sex() {
}
}

CFR

CFR是另外一个Java反编译工具。
其提供了一些开关,让我们选择生成的源代码是否包含糖。
但是,其生成的源代码为纯文本文件,不是一个GUI工具,用户体验并不好。

Bytecode Viewer

Bytecode Viewer是一个强大的反编译工具,其集成了6个Java反编译库(包含Fernflower和CFR),Andorid反编译类库和字节码类库。
这个工具提供GUI界面,可以提升使用CFR的用户体验。
下面上面enum示例的反编译效果:

  • 左边为Fernflower的反编译效果
  • 右边为CRF的反编译效果。我们可以看到enum其实是定义了一个继承自Enum类的子类
    avatar

下图展示了CFR的语法糖开关:
avatar