Java反编译器

22

你能推荐一个适用于Eclipse的Java反编译器吗?我的另一个问题是,从其他Java程序中反编译代码使用有什么限制?这是非法的还是什么?我对许可证不太了解。感谢您的阅读。


类似的讨论在选择和测试Java反编译器中。 - dma_k
“Eclipse Class Decompiler” 可能是吗?网站位置为 http://feeling.sourceforge.net/update/。更多信息请参见 http://www.blogjava.net/cnfree/archive/2012/10/30/390457.html 和 http://feeling.sourceforge.net/。 - Adriano
9
很有趣,这些问题被关闭为不相关的主题,因为像我一样的许多程序员会在 Stack Overflow 上寻找这些确切的问题(并通过下面发布的答案找到答案)。此外,根据该网站的“提问”部分,问题应“通常涵盖程序员常用的软件工具”。 - Bryan Larson
我已经做了一个列表:https://community.jboss.org/people/ozizka/blog/2014/05/06/java-decompilers-a-sad-situation-of - Ondra Žižka
7个回答

31

我建议使用在Google上弹出的那个,也就是JD Java反编译器。 它的效果非常好。

至于限制方面,您需要阅读特定软件的许可协议,可能会写明禁止任何反编译方式。


3
+1 - 阅读许可证。如果您违反许可证条款而被起诉,"我不太了解许可证"不是一个有效的借口。 - Stephen C
1
提醒一下,目前这在3.7(Indigo)中不起作用。 - James McMahon
1
JD-GUI无法反编译由AspectJ编织的类型 - 所呈现的Java代码被截断。 - mark
3
我正在为JD-Eclipse开发一个封装,以使其更加出色:http://mchr3k.github.com/jdeclipse-realign/ - mchr

7

我喜欢JadClipse,但它在某些地方显得有点老旧。你需要:

  • 一个jad二进制文件
  • 安装jadClipse
  • 将Eclipse首选项指向上述jad二进制文件
  • 告诉它生成行号和对齐方式以进行调试

它有几个缺点:

  • 代码是按顺序生成的,如果字节码被重新排列以使一些内容在字节码中较晚,但在原始源代码中较早,则jad不会倒回以将反汇编的代码放到正确的行。
  • jad无法很好地理解Java 5 + 6字节码。

5

我尝试了几个反编译器,大多数都未能为我尝试反编译的小程序生成正确的源代码(它位于http://mrl.nyu.edu/~perlin/experiments/emotive-actors/,如果有人想复制的话)。

唯一完美运行的是Cavaj 1.11,它产生的代码不包含语法错误,从源代码编译的小程序与原版完全一致。我所缺乏的只是UI界面上的Ctrl-A / Ctrl-C键盘快捷键无法使用,并且没有批量转换功能。

我尝试过的其他反编译器包括:

  • JD Java Decompiler(免费软件)看起来不错,但它在变量声明方面犯了许多错误(有些声明缺失,有些放置位置错误)。
  • Neshkov DJ Java Decompiler(共享软件)也很不错,它产生的代码比JD少了一些语法错误,但代码无法正常工作。考虑到该产品并非免费,人们会对它有更高的期望。

2
Cavaj只是Jad的包装器。不幸的是,Jad没有得到维护,并且缺少对Java 6/7的支持,例如它不支持静态导入。 - rustyx

5
我使用了这个Eclipse插件:JadClipse和这个Java反编译器:JAD

2

根据你提供的链接,只有在特定情况下才被认为是合法的,至少在美国是这样。 - Jon L.

2

JD 是我知道的最好的 Java 反编译工具。


JD-GUI无法反编译由AspectJ编织的类型 - 所呈现的Java代码被截断。 - mark

1

我发现JD非常好。虽然我遇到了一两个小错误,导致程序在运行时表现出意外的行为。

例如,我有一个例子,原始的case语句在最后一个节点上没有'break'(因为自然而然这是不必要的),但是由于JD最终重新排序了节点,这意味着意外调用了'default' case。我还遇到了字符集问题,需要在结尾处进行一些额外的toString()调用才能按预期记录输出。除此之外它很棒!

我使用另一个反编译器DJ来帮助我解决JD反编译的代码中的问题。但是有些东西DJ处理不了,所以我想两种反编译器混合使用对我有用:)

希望Dupuy先生会看到这个!


JD-GUI无法反编译由AspectJ编织的类型 - 所呈现的Java代码被截断。 - mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接