Java class 文件知道白色 space 吗?

Do Java class files know about white space?

我写了一个 Java 程序,然后编译它,然后反编译它,得到一个 Java 文件。反编译器返回了与我的原始 Java 文件完全相同的缩进的 Java 文件,但这就是反编译器所做的,这不是问题,我脑海中的问题是缩进。

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

现提问如下:

  1. 我的结论正确吗?

如果是:

  1. 为什么 class 文件需要了解缩进?

  2. 缩进是为了提高可读性,没有人阅读 class 文件,那么为什么 class 文件不能存储它并保存一些 space?

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

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

我能想到您的 class 反编译文件看起来与您的输入完全一样的可能原因有两个:

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

它们 包含与执行的代码关联的行号以帮助调试。

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

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

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

As decompiled Java file have the exact same indentation as the original I conclude that class files stores indentation data too

为什么你会根据一次观察得出这样的结论?

你为什么不至少假设它是巧合的可能性?大多数 Java 代码风格遵循相当标准的约定。很可能反编译器和您对如何布局相同的 Java 代码有非常相似的想法。

无论如何,您可以轻松地检验您的假设。只需写一个 Java class 和一些非常不标准的缩进 - perhaps no whitespace or linebreaks at all - 然后看看结果是什么。

你会发现你的假设是不正确的。