为什么Java类文件需要了解空白?

问题描述 投票:1回答:2

我编写了一个Java程序,然后对其进行了编译,然后他们反编译并获得了Java文件。反编译器以原始缩进的形式返回了与原始Java文件完全相同的Java文件,但这就是反编译器所做的事情,这在我脑海中燃起了疑问的是缩进并不是问题。

作为反编译的Java文件,其缩进与原始缩进完全相同,因此我得出结论,类文件也存储缩进数据。

现在问题如下:

  1. 我的结论正确吗?

如果是:

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

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

  3. 类文件仅仅是加密的Java源文件,反编译器可以解密该文件以将其返回给原始文件吗?

java decompiler
2个回答
4
投票

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

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

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

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

但是尝试在您的某些表达式中添加一些随机空间,您会看到反编译器无法重构这些空间。

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

您甚至可以在编译过程中关闭调试信息以剥离更多信息(例如,局部变量名称)。


0
投票

作为反编译的Java文件,其缩进与原来我得出的结论是,类文件也存储缩进数据

您为什么要根据一个观察得出结论?

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

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

您会发现您的假设不正确。


-2
投票

您可以检查Java Decompiler on java point了解反编译时会发生什么。

© www.soinside.com 2019 - 2024. All rights reserved.