Java 类文件知道空格吗?

Abh*_*han 1 java decompiler

我写了一个 Java 程序,然后编译它,然后反编译它并得到一个 Java 文件。反编译器将精确缩进的精确 Java 文件返回给我的原始 Java 文件,但这就是反编译器所做的,这不是问题,在我脑海中燃烧的问题是缩进。

由于反编译的 Java 文件与原始文件具有完全相同的缩进,因此我得出结论,类文件也存储了缩进数据。

现在的问题如下:

  1. 我的结论正确吗?

如果是:

  1. 为什么类文件需要知道缩进?

  2. 缩进是为了可读性,没有人读取类文件,那么为什么类文件不能存储它并节省一些空间呢?

  3. 类文件只是一个加密的 Java 源文件,反编译器可以在其中解密以返回原始文件吗?

Joa*_*uer 8

编译后的类文件包含源文件的确切空白信息。

我认为您的反编译类文件与您的输入完全一样,有两个可能的原因:

  • 您碰巧用与反编译器使用的样式匹配的样式编写了原始输入
  • 您实际上并没有查看反编译的源代码,而是以某种方式查看了原始文件(例如,因为反编译器没有将输出写入您认为的位置)

它们确实包含与为帮助调试而执行的代码相关联的行号。

但是尝试在您的某些表达式中添加一些随机空格,您会发现反编译器无法重建它们。

不,类文件不是源文件的简单“加密”,编译时会丢失大量信息(实际上可能会添加一些从引用类中获取的信息,例如被调用方法的特定签名)。

您甚至可以在编译期间关闭调试信息以去除更多信息(例如局部变量名称)。