2017-02-15 191 views
1

我用兩個反編譯器JD-GUI和Luyten反編譯.jar文件,但結果不同。爲什麼。反編譯器中的jar反編譯結果不同?

例如,Luyten的結果具有更具體的名稱空間。

此外,某些行中的源代碼也有所不同。

爲什麼兩個反編譯器反編譯相同的.jar文件有所不同?

+0

因爲有多個可能產生相同字節碼的Java源代碼。 – EJP

+1

*產生完全相同字節碼的*「java源代碼」*之間的唯一區別將基於語法。 rick正在查看的字節碼已被編譯。反編譯器處理翻譯的方式不同。例如,如果要將JD-GUI,CFR,Procyon和Fernflower的輸出複製粘貼到java文件中並進行編譯,則它們不會生成完全相同的字節碼。當然它的功能相同*(不包括邊緣情況下)*但這不是重點。重點是任何兩個反編譯器之間將字節碼轉換回java的過程是不同的。 –

回答

1

您列出的反編譯器使用不同的後端來處理java字節碼的解析。

  • Luyten使用Procyon
  • JD-GUI使用JD-Core (無源代碼)

你可以想像不同的學者將反編譯器翻譯成現代英語。由學者抄錄的原始資料「Luyten」「JD-GUI」是一樣的,但每個學者都抄錄不同的文字。兩者都創造現代英語,通常相當清晰,但每個人都有自己的微小差異。

例如:如果古源材料指出,"a man reached down and picked up an apple"學者可能會說:

該男子拿起一個蘋果。

那人抓起一個蘋果。

都得到跨越意義,但它們之間略有差別。有時候,人們可能會比其他人更瞭解源材料的奇怪怪癖,因而會產生比另一種更準確的結果。

例如,JD-GUI can't decompile a method if the last instruction of a method is the last one in a try-catch block但Procyon將能夠將它翻譯成Java它就好了。