【问题标题】:Java Code Generation (Metaprogramming, Reflection, wtv)Java 代码生成(元编程、反射、wtv)
【发布时间】:2011-02-07 02:23:30
【问题描述】:

有谁知道 Java 工具(类似于 C# 的 codedom),它提供了一种将 Java 代码生成到 .java 文件的方法?

编辑: 我正在构建一个平台,其主要目标是自动化操作。给出一些输入,我想为外部工具生成代码。所以它不是在运行时生成。我想生成并输出到一个实际的文件。

【问题讨论】:

  • 什么样的代码生成,什么样的程序?是否在运行时生成代码?请更具体。
  • 这里的最终目标是什么? Java 有很多用于创建或修改字节码(编译后的 Java 代码)的工具,但我不知道有什么工具可以直接生成 Java 代码。
  • 我正在构建一个平台,其主要目标是自动化操作。给出一些输入,我想为外部工具生成代码。所以它不是在运行时生成。我想生成并将其输出到实际文件中。

标签: java reflection code-generation metaprogramming codedom


【解决方案1】:

我使用 ASM 在字节码级别修改现有类或动态生成全新类都取得了一些成功。 tutorial 以一种非常容易理解的方式引导您完成此操作。

ASM 像大多数此类工具一样生成字节码而不是源代码。这样做的原因是,如果您想从程序中动态生成和执行新代码,从历史上看,调用 Java 编译器并不是直接的。因此,生成和使用字节码通常比源代码更容易。

如果您需要在程序中立即生成和运行代码,我建议您使用字节码操作工具。如果您只需要 Java 源代码,我会推出自己的代码生成器,它采用我的输入格式并生成代码。您可能想寻找 framework 来帮助您解决此问题,但由于源文件只是文本,通常自己创建它同样容易,特别是如果您有自定义输入格式。

【讨论】:

  • 如果我想在运行时更改某些内容会很好,但我实际上会生成静态代码以供进一步使用。
  • ASM 不仅仅用于字节码修改。如果您不需要源代码,那将是完美的。尤其是出色的 Eclipse 字节码大纲。
  • 谢谢,但 Freemarker 可以做我想做的事 (:
【解决方案2】:

JET 可能已经过时了(我没用过)JET Tutorial Part 1

更多Eclipse插件Plugins in Code Generation

编辑: 抱歉,我不知道 codedom 以及这个工具意味着什么功能。

独立版是FreemarkerVelocity 另见example

【讨论】:

  • 但这将依赖于 Eclipse,并且必须是独立的。这就是为什么我说类似 c# 的 codedom 的原因。
【解决方案3】:

您可以尝试使用现有语法(例如来自 ANTLR)并构建 AST。然后从 AST 生成代码。这应该比简单的模板更健壮。对于中间的事情,我建议 Terence Parr 关于StringTemplate 的(令人大开眼界的)谈话。 (抱歉,手头没有演讲的链接)

【讨论】:

  • 谢谢,但 Freemarker 可以做我想做的事 (:
【解决方案4】:

我不确定您真正需要什么,但请查看 javassist。是你要找的东西吗?

【讨论】:

    【解决方案5】:

    ABSE 和 AtomWeaver 形成了一个代码生成和模型驱动的开发框架,您可以在其中轻松实现您想要的。 ABSE 是一种新方法,您可以在其中从较小的位(称为 Atom)编写代码生成器,而 AtomWaver 是一个简单的 IDE,可让您实现、操作和使用您的生成器模型。

    它还允许非程序员构建程序/配置/任何东西,由已构建的部分(您之前准备的原子)制成。

    这个项目现在刚刚公开发布,并且现在正在提供一个 alpha 版本。 ABSE 是开放的,AtomWeaver 可免费用于个人和商业用途。

    在此处获取更多信息:http://www.abse.info(免责声明:我是项目负责人)

    【讨论】:

    • 谢谢,但 Freemarker 可以做我想做的事 (:
    猜你喜欢
    • 2014-05-19
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    相关资源
    最近更新 更多