2011-06-06 32 views
1

我們有正常的java文件駐留在SVN中。我們對這些文件進行了一些更改,但是恰巧那些文件丟失了(它們不在SVN中)。但是我們有使用新更改的文件生成的類文件。反編譯java類文件並與svn比較

我們可以使用類文件,反編譯它們並將其與SVN進行比較。最簡單的方法是什麼?

約有400個變更文件。所以一個一個的比較是不可行的。

我正在尋找任何工具或腳本。

還有什麼反編譯器,這將反編譯整個文件夾?

感謝

+0

這可能會很棘手,因爲反編譯總是一種猜測。它不會產生* original *源代碼,只會編譯成相同的字節代碼。因此,您會得到很多虛假差異 - 如果您手動完成並對這些更改有一個粗略的概念,這可能很好,但自動執行此操作將是一個真正的挑戰。 – 2011-06-06 08:39:41

+4

如果您使用Eclipse進行開發,可能會 - 它們還沒有丟失。您可以嘗試從本地歷史恢復。 – adarshr 2011-06-06 08:40:29

+0

我不是在談論自動做,但至少應該比較並說出哪些文件是不同的。 – vinoth 2011-06-06 08:41:01

回答

8

反編譯使用JAD,最常用的工具。比較有點棘手,但。我建議以下情形:

  1. 獲取最新的源代碼SVN
  2. 構建它
  3. 反編譯
  4. 把你編譯的類,其中包括一些修改,但是你沒有(!)來源
  5. 反編譯他們以及
  6. 比較兩個反編譯源目錄

爲什麼編譯和反編譯原始源代碼?因爲JAD產生了相當不錯的結果,但它永遠不會生成所使用的相同源。因此,如果您想在比較原始資源和反編譯的資源(並快速查明實際差異)時避免頭痛,則必須比較兩個JAD輸出,而不是原始資源和合成JAD輸出。

我希望有兩個目錄結構比較不會是你的問題。您可以在Linux上的Windows或各種工具/腳本使用Total Commander,如:

$ diff -r dir1 dir2 
+1

+1:JAD不會恢復註釋,原始行間距,使用import * vs導入每個類,局部變量的名稱,SOURCE保留註釋等等,因爲這些信息不在類中。 – 2011-06-06 09:15:07

+0

http://java.decompiler.free.fr/ imo它比JAD更好 – bestsss 2011-06-11 20:41:02

1

使用JD-GUI,很好反編譯,但compering ......它的將是痛苦的。

2

如果在生成類文件時沒有使用混淆,可以將反編譯的源文件與原始文件進行比較。但是,自動化比較將會很困難,因爲例如由於編譯器優化,經反編譯的源代碼通常與原始源代碼稍有不同。 我個人使用jad作爲反編譯器,但我不確定你可以一次性提供整個文件夾。

2

jad可以反編譯整個文件夾,但結果取決於幾個因素。首先,JAD只支持Java 4。 Java 5及更高版本將包含JAD不理解的奇怪字節代碼塊。

如果使用調試符號編譯代碼,則可以重新對齊行號(jadclipse插件可以這樣做),但JAD本身無法執行此操作。

如果您使用-g:source編譯代碼,那麼類文件將包含完整的源代碼。乍一看,我不知道如何解決這個問題,但是像javap(附帶JDK)或ASM這樣的工具應該可以讓你得到它。

2

我用下面的命令(JAD反編譯器)來編譯一氣呵成的文件夾中的所有類文件。

   jad -o -r -sjava -dsrc tree/**/*.class 
0

現在即時通訊正是這樣做的,使用http://java.decompiler.free.fr/反編譯和無法比擬的(http://www.scootersoftware.com/)比較的包和文件。對編譯和反編譯的實際版本(svn)進行快速比較看起來是一個好主意,以檢查哪些文件(以及哪些部分)是最新的。