我编写了一个Java程序,然后对其进行了编译,然后他们反编译并获得了Java文件。反编译器以原始缩进的形式返回了与原始Java文件完全相同的Java文件,但这就是反编译器所做的事情,这在我脑海中燃起了疑问的是缩进并不是问题。
作为反编译的Java文件,其缩进与原始缩进完全相同,因此我得出结论,类文件也存储缩进数据。
现在问题如下:
如果是:
为什么类文件需要了解缩进?
缩进是为了提高可读性,没有人读取类文件,所以为什么类文件不能只是不存储它并节省一些空间?
类文件仅仅是加密的Java源文件,反编译器可以解密该文件以将其返回给原始文件吗?
编译的类文件不包含源文件的确切空白信息。
有两个可能的原因,我可以想到您反编译的类文件看起来与您的输入完全一样:
它们do包含与为帮助调试而执行的代码相关的行号。
但是尝试在您的某些表达式中添加一些随机空间,您会看到反编译器无法重构这些空间。
并且不,类文件不是源文件的简单“加密”,编译时会丢失大量信息(并且可能实际上添加了从引用的类中获取的一些信息,例如所调用方法的特定签名) 。
您甚至可以在编译过程中关闭调试信息以剥离更多信息(例如,局部变量名称)。
作为反编译的Java文件,其缩进与原来我得出的结论是,类文件也存储缩进数据
您为什么要根据一个观察得出结论?
您为什么不至少不认为这是巧合的可能性?大多数Java代码风格都遵循相当标准的约定。很明显,反编译器和您对如何布置相同的Java代码有非常相似的想法。
无论如何,您可以轻松地检验您的假设。只需编写带有一些非常不标准的缩进的Java类-perhaps no whitespace or linebreaks at all-然后查看结果是什么。
您会发现您的假设不正确。
您可以检查Java Decompiler on java point了解反编译时会发生什么。