簡體   English   中英

哪些設置會影響已編譯的java .class文件的布局? 如何判斷兩個編譯的類是否相等?

[英]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文件?

對於諸如常量池條目的順序(基本上所有符號信息)以及每個字段/方法/類的屬性之類的事物而言,這不是必需的順序。 不同的編譯器可以按他們想要的順序自由寫出。

您可以比較編譯的類,但您需要深入研究類文件結構並解析它。 有像這樣的圖書館,比如BCELASM ,但我不是百分百肯定他們會幫助你做你想做的事情。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM