1

我们在 SVN 中有普通的 java 文件。我们对这些文件进行了一些更改,但碰巧这些文件丢失了(它们不在 SVN 中)。但是我们有使用新更改的文件生成的类文件。

我们可以使用类文件,反编译它们并将其与 SVN 进行比较。最简单的方法是什么?

大约有 400 个更改的文件。所以一一比较是行不通的。

我正在寻找任何工具或脚本。

还有没有反编译器,可以一次性反编译整个文件夹?

谢谢

4

6 回答 6

8

对于反编译使用JAD,最常用的工具。虽然比较有点棘手。我建议以下场景:

  1. 从 SVN 获取最新的源代码
  2. 构建它
  3. 反编译它(!)
  4. 获取包含一些修改但没有源代码的编译类
  5. 也反编译它们
  6. 比较两个反编译的源目录

为什么要编译和反编译原始源代码?因为 JAD 产生了非常好的结果,但它永远不会生成与使用的完全相同的源。因此,如果您想在比较原始源和反编译源时避免头疼(并快速查明实际差异),您必须比较两个 JAD 输出,而不是原始源和合成 JAD 输出。

我希望有两个目录结构来比较对你来说不是问题。您可以在 Windows 上使用Total Commander或在 Linux 上使用各种实用程序/脚本,例如:

$ diff -r dir1 dir2
于 2011-06-06T08:47:55.607 回答
2

如果您在生成类文件时没有使用混淆,则可以将反编译的源文件与原始文件进行比较。但是,自动比较将很困难,因为例如由于编译器优化,反编译的源代码通常与原始源代码略有不同。我个人使用jad作为反编译器,但我不确定您是否可以一次性为其提供整个文件夹。

于 2011-06-06T08:45:28.990 回答
2

jad可以反编译整个文件夹,但结果取决于几个因素。首先,JAD 只支持 Java 4。Java 5 及更高版本将包含 JAD 无法理解的奇数字节代码块。

如果代码是用调试符号编译的,你可以重新对齐行号(jadclipse插件可以做到这一点)但 JAD 本身不能做到这一点。

如果您使用 编译代码-g:source,则类文件包含完整的源代码。乍一看,我不知道该怎么做,但是javap(JDK 附带)或ASM之类的工具应该可以让您获得它。

于 2011-06-06T08:46:23.110 回答
2

我使用以下命令(jad 反编译器)一次性编译文件夹中的所有类文件。

             jad -o -r -sjava -dsrc tree/**/*.class 
于 2011-06-06T11:21:44.703 回答
1

使用 jd-gui,非常好的反编译器,但是编译......它会很痛苦。

于 2011-06-06T08:43:03.617 回答
0

现在我正在这样做,使用http://java.decompiler.free.fr/进行反编译和比较(http://www.scootersoftware.com/)来比较包和文件。与编译和反编译的实际版本 (svn) 进行快速比较,以检查哪些文件(以及哪些部分)是最新的,这看起来是个好主意。

于 2012-03-07T12:48:13.923 回答