我正在寻找将Java字节码转换为其他编程语言的方法/工具/项目,或者至少将其转换为结构化表示(如XML)。理想的开源,自然。
我查看了ASM,“字节码操作和分析框架”。它不支持翻译到其他表示,但看起来像是这样一个项目的良好基础。可悲的是,他们users page上列出的项目都没有接近。
答案 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中删除一些例子。
最后,从一种低级语言(字节码)转换到另一种低级语言将非常棘手,正确性将成为一个问题。