java - 哪些设置会影响已编译的 java .class 文件的布局?你怎么知道两个编译类是否相等?

标签 java compiler-construction comparison bytecode javac

我有一个使用内置 Eclipse“编译”任务编译的应用程序。然后我决定将构建过程移到 Ant 的 javac 中,结果文件变小了。

后来我发现将调试级别调整为 "vars,lines,source" 我可以嵌入与 Eclipse 相同的调试信息,并且在很多情况下文件保持完全相同的大小但是内部布局不同。因此,我无法使用 md5sum 签名来确定它们是否是完全相同的版本。

除了调试信息,2 个本应相同的文件得到不同内部布局或大小的原因可能是什么?

如何比较编译后的 .class 文件?

最佳答案

对于诸如常量池条目(基本上是所有符号信息)的顺序以及每个字段/方法/类的属性之类的东西,没有必需的顺序。不同的编译器可以自由地按照他们想要的任何顺序写出。

您可以比较已编译的类,但您需要深入研究类文件结构并对其进行解析。有一些库可以做到这一点,比如 BCELASM ,但我不能 100% 确定他们会帮助您完成您想做的事情。

关于java - 哪些设置会影响已编译的 java .class 文件的布局?你怎么知道两个编译类是否相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/644320/

相关文章:

java - JPA 相当于此 mySql 查询

c++ - LLVM IR 生成的代码到 native 代码

iphone - 什么是好的c编译器

c++ - 获取缓冲区内容,将其存储在结构中,获取新的缓冲区内容,看看结构中是否相等

java - 我可以将paintComponents() 添加到数组中吗?

java - 如何在某一天单击鼠标时选择 jCalender 日期

csv - 如何测试 CSV 文件以及如何找出两个 CSV 文件之间的差异

计算二叉搜索树中的比较次数

java - 谷歌地图无法使用手势

c++ - 如何使用 CMake 将 NMake 从 VS9 切换到 VS10