[英]What settings affect the layout of compiled java .class files? How can you tell if two compiled classes are equal?
我有一個使用內置Eclipse“編譯”任務編譯的應用程序。 然后我決定將構建過程移動到Ant的javac
,結果變成了較小的文件。
后來我發現將調試級別調整為"vars,lines,source"
我可以嵌入與Eclipse相同的調試信息,並且在很多情況下文件保持完全相同的大小但內部布局不同。 因此,我無法使用md5sum簽名來確定它們是否完全相同。
除了調試信息之外,2個所謂的相等文件獲得不同內部布局或大小的原因是什么?
你怎么能比較編譯的.class文件?
ASM Eclipse 插件中有一個字節碼比較器。 您選擇兩個類,右鍵單擊,並與比較/相互字節碼。
需要注意的一點是Eclipse不使用javac。 Eclipse有自己的編譯器, JDT ,因此產生的.class文件的差異並不讓我感到驚訝。 我希望它們不是逐字的,因為它們是不同的編譯器。
由於它們的不同,存在使用javac而不是JDT編譯的代碼,反之亦然。 通常我已經看到,在大量使用仿制葯的情況下,兩者的差異變得明顯
最重要的是,局部變量的堆棧槽可以任意排列,而不會改變代碼的語義。 所以基本上,你不能比較編譯的類文件而不解析和規范它們 - 相當多的努力。
你為什么要這樣做呢?
正如Michale B所說,它可以是任意的。
我在使用文件大小作為安全性的系統上工作。 如果.class文件的大小發生更改,則不會為該類授予特定權限。
通常這很容易解決,但我們對環境有相當完全的控制,所以它實際上非常實用。
無論如何,只要重新編譯被監視的類,我們就必須重新計算大小。
另一件事 - 編譯文件時會生成一個特殊的密鑰號。 我對此並不了解,但它經常阻止課程一起工作。 我相信程序是,編譯A類並保存它(稱之為a1)。 再次編譯類a(a2)。 針對類a2編譯類b。 嘗試針對a1運行b。 我相信在這種情況下它會在運行時失敗。
如果您可以了解有關該密鑰的更多信息,它可能會為您提供您所需的信息。
對於comparisson,您可以反編譯您的類文件並使用生成的源進行播放。 看到這個 。
Eclipse是否正在使用一些工具來協助在調試器中運行?
最終,正在使用的配置可能正在發揮作用。 假設他們使用的是相同版本的Java,那么可以使用許多選項來進行編譯配置(JDK合規性,類文件兼容性和一系列調試信息選項)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.