2015-11-01 37 views
-2

可以反編譯Java類文件以顯示編譯器添加的所有代碼的方式?例如,Java編譯器在沒有找到顯式構造函數時插入一個無參數構造函數。但是,當我沒有顯式構造函數反編譯類文件時,編譯器插入的文件不會顯示出來。另一個例子是編譯器在任何沒有明確擴展其他類的類中插入「extends java.lang.Object」。同樣,當我反編譯這樣的類時,我沒有在反編譯的文本中看到類聲明的「擴展」組件。也許我正在考慮Java編譯器從字面上「插入」代碼的事實?也許我需要一個更復雜的反編譯器?查看由Java編譯器插入的代碼

+0

請考慮讀取字節碼。 –

+0

如果可能的話,我會要求任何倒票都附有解釋性評論。即使經過後面的審查,這並不總是顯而易見的,爲什麼一個職位可能不清楚,沒有用處,或者沒有顯示研究努力,這是投票的標準。非常感謝。 – John

+1

您如何看待「不顯示研究成果」(我個人認爲問題在這裏,即使我沒有downvote)標準可以處理? –

回答

-1

更好地使用字節碼查看器作爲asm的ASMifier。編譯器添加的某些指令在反編譯時跳過,以便保持源代碼和反編譯的代碼接近。

您將通過簽名public <init>()V找到默認構造函數。如果沒有定義構造函數,它將被添加到字節代碼中。

+0

謝謝CoronA。你和Thorbjørn讓我走上了正確的道路。使用字節碼查看器我會看到缺省的無參數構造函數以及反編譯器沒有顯示的一堆其他代碼。然而,我並沒有在類的聲明中看到「extends java.lang.Object」,它是Object的直接後裔。我將此作爲觀察的證實,即某些代碼在運行時而不是由編譯器添加。 – John

+0

「某些默認...運行時」語句不正確。 –

+0

'extends ArrayList'出現在字節碼中,'extends Object'不出現。但是構造函數總是可以在字節碼中找到。所以我糾正了我的陳述。 – CoronA