10

这个页面描述了我如何使用 javac 中的代码生成器来生成代码,因为我可以构建一个 AST(使用我编写的单独的解析器)。该技术涉及编辑 javac 的源代码以基本上绕过 Java 解析器,以便可以将他/她自己的 AST 提供给代码生成器。这可以工作,但我希望以一种更清洁的方式来做。我想将 javac 的代码生成部分作为库包含在我的项目中,这样我就可以使用它来生成代码,而无需携带 javac 的其余源代码。

有没有办法用 javac 做到这一点,或者是否有更好的库?

另外,请随意更改问题的标题。我想不出更好的,但它有点模棱两可。如果您建议编辑以获得更好的标题,我会接受。

4

2 回答 2

4

我认为您可能感兴趣的是像BCEL(字节码工程库)这样的 java 库

当我在编译器构造上学习一个类时,我玩过它,基本上,它有一个很好的包装器来生成常量池,将命名字节码指令插入一个方法等等,然后当你完成后,你可以加载这个类在运行时使用自定义类加载器,或以正常方式将其写入文件。

使用 BCEL,从语法树到 Java 字节码应该相对容易,尽管有点乏味,但在某些情况下,您可能只想使用 BCEL 生成原始字节码而不构建树。

于 2012-07-31T17:29:22.793 回答
1

另一个很酷的框架是ASM,一个字节码分析和操作框架。

如果您不想使用框架,截至目前(2014 年),无法使用此处所述的 com.sun.source.tree.* 的任意表示从树生成字节码。

于 2014-06-29T03:05:07.197 回答