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

时间:2009-03-12 12:54:47

标签: java translation bytecode decompiling

我正在寻找将Java字节码转换为其他编程语言的方法/工具/项目,或者至少将其转换为结构化表示(如XML)。理想的开源,自然。

我查看了ASM,“字节码操作和分析框架”。它不支持翻译到其他表示,但看起来像是这样一个项目的良好基础。可悲的是,他们users page上列出的项目都没有接近。

4 个答案:

答案 0 :(得分:7)

ASM有树api,它基本上可以为你提供字节码的完整结构。看起来它很容易使用,甚至访问者api以XML或其他格式打印出来。不知道那是什么用途。

转换回Java是一个反编译工作,像Jad这样的工作做得很好。但这很难,因为a)在源到字节码转换期间丢失了信息,b)存在多个源可以产生相同字节代码的模糊性。

如果你真的想直接从字节码转换到另一种高级语言,那么全面而有意义地做这两件事都很困难,因为反编译很难,除非更糟糕的是另一种语言。

如果您想从Java源代码转到另一种语言的源代码,那么之前就已完成此操作,如此Java-to-Python converter。这有点容易,因为您可以使用Antlr或内置的Java编译器工具Project Jackpot等将Java转换为AST。即便如此,我认为您不会得到非常惯用的代码用目标语言。

答案 1 :(得分:2)

尝试BCEL(字节码工程库)。 您可以实现一个Visitor接口,您可以使用它来生成您想要的内容(使用其他语言的源代码,自定义AST,xml,以及任何内容)。

我将它用于大学的一个项目,在那里我(大部分)修改了一个程序分析框架,该程序分析框架将Java源代码编写成一个也可以对抗Java字节代码的框架。该任务涉及为分析框架的内部AST表示生成节点。

此外,

我简要地略过了你提到的“ASM”项目的文档。看起来它定义了几个vistior类。您应该能够使用它们来做你想做的事。

如果您不熟悉访客模式,请查看说明here。此外,如果您还没有阅读,“Gang of Four”书很好读。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您可以尝试gcj将字节码转换为本机代码。

如果你想转换成像python / groovy / ruby​​这样的语言,也许考虑直接在JVM上编写这些语言(我意识到这不是完全你正在寻找的东西)。

也许从这样的Eclipse Byte Code outline viewer中删除一些例子。

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