将Java字节码转换为其他表示形式和编程语言

8
我正在寻找将Java字节码翻译成其他编程语言或至少转换为结构化表示(如XML)的方法/工具/项目。最好是开源的。我已经看过了“字节码操作和分析框架”ASM,它不支持翻译为其他形式,但看起来是这样一个项目的良好基础。可悲的是,他们用户页面列出的项目都与此无关。
4个回答

8
ASM有树API,可以基本上给出字节码的完整结构。似乎很容易使用该API或者甚至访问者API将其打印成XML或其他格式。不确定那有什么用处。
反向翻译回Java是反编译器的工作,像Jad这样的工具做得还不错。但这很难,因为a)在源代码到字节码的转换过程中会丢失信息,b)存在多个源代码可能生成相同的字节码的歧义。
如果您确实想直接从字节码转换为另一种高级语言,那么这将是一个艰巨的任务,无法全面且有意义地完成,原因与反编译困难相同,只不过更糟糕,因为需要转换到另一种语言。
如果你想将Java源代码转换为其他语言的源代码,这已经做过了,例如 Java-to-Python 转换器。这有点容易,因为你可以使用诸如Antlr或内置Java编译器工具Project Jackpot之类的工具将Java转换为AST。即便如此,我认为目标语言中得到的代码也不会非常符合惯用语法。

2
尝试使用BCEL(字节码工程库)。您可以实现Visitor接口,用于生成任何您想要的内容(另一种语言的源代码、自定义AST、XML等)。
我在大学的一个项目中使用它,主要是修改了一个针对Java源代码的程序分析框架,使其也能够针对Java字节码进行工作。这项任务涉及为分析框架的内部AST表示生成节点。
此外,
我简要浏览了您提到的“ASM”项目的文档。看起来它定义了几个访问者类。您应该也能够使用它们来完成您想要的操作。
如果您不熟悉访问者模式,请查看这里的描述。另外,如果您还没有阅读过《{{link3:设计模式》(Gang of Four)》这本书,那么它是值得一读的。

1

看起来你正在寻找一个交叉编译器。我知道xmlvm这个项目,但从未使用过。也许它适合你的需求。


1

你可以尝试使用gcj将字节码转换为本地代码。

如果你想要转换成像Python/Groovy/Ruby这样的语言,也许考虑直接在JVM上用这些语言编写(我知道这不是你想要的完全)。

也许可以从Eclipse Byte Code outline viewer这样的东西中找一些例子。

最后,从一种低级语言(字节码)转换到另一种低级语言会非常棘手,正确性将是一个问题。


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