【问题标题】:Complete metaprogramming framework for Java?完整的 Java 元编程框架?
【发布时间】:2011-11-15 09:34:24
【问题描述】:

我对元编程(即帮助程序员完成繁琐的编程任务的程序)感兴趣。我正在寻找具有以下属性的工具:

  • 可在编译时和运行时使用;
  • 检查程序结构;
  • 可以添加新的类、方法或字段并使它们对 Java 编译器可见;
  • 可以改变方法的行为;
  • 基于 Java(嗯,根据某些排名,Java 是最流行的编程语言);
  • 与 IDE 和构建工具(如 Ant、Gradle 或 Maven)的良好集成;
  • 积极维护的项目;
  • 易于使用和扩展;

对此有一些解决方案,例如:

  • 反思
  • AspectJ
  • 注解处理工具
  • 字节码操作(CGLIB、Javassist、java.lang.instrument)
  • Eclipse JDT
  • Project Lombok
  • Groovy、JRuby、Scala

但不幸的是,它们都不符合上述所有标准。有没有完整的 Java 元编程解决方案?

【问题讨论】:

  • 我会删除“你会和我一起为此开始一个新项目吗?”-部分。 SO 不适合讨论这个问题。
  • Groovy 似乎符合要求。 “Java 编译器”在运行时不运行,除了热点,所以我不确定你想要什么。
  • 那有什么更好的地方呢? :-) 这只是一个问题,不是项目规划,所以我觉得这个地方还可以。
  • @iirekm:我的建议是启动项目,然后放到 Github 上。没有什么比工作代码更能吸引贡献者了。
  • @iirekm:Intelli-J 有很好的 Groovy 支持。无论如何,Eclipse 都是垃圾,除了时髦。

标签: java metaprogramming


【解决方案1】:

JackPot 是基于 Java 的,但我认为目前并没有引起太多关注。拥有 AST 和符号表 AFAIK。您可能可以扩展它;我怀疑有人会阻止(或帮助)你。

Sun,呃,Oracle Java 编译器有基于 Java 的编译器 API。它们可能得到积极维护,但我认为您不能修改源代码并重新生成它。当然有符号表;不知道树。可能很难扩展;你必须跟上编译器的步伐,而不是相反。

ANTLR,它有一个 Java 实现和一个将构建 AST 的 Java 解析器。我认为它没有完整的符号表,因此进行认真的代码分析/修订可能会很困难。 ANTLR 肯定得到积极维护,没有人会反对您使用符号表增强 Java 语法。只要知道这将花费你大约 6 个月的 Java 1.6,如果这就是你所做的一切。 (从 1.4 的符号表支持开始,我们内部的 [智能] 人员为 DMS 做这件事花了多长时间)。

我们的DMS Software Reengineering Toolkit 及其Java Front End 不在Java 中,也不容易集成到IDE 中,但能够对Java 代码进行大量分析和转换。

DMS 是通用编译器机制:解析、AST 构建、符号表机制、流分析机制,以及源到源转换和 AST 的通用漂亮打印返回法律文本的额外好处,包括保留 cmets。它提供了一组支持这些服务的 API,以及用于定义语法和依赖于语言的流分析器的附加工具。

Java 前端为 DMS 提供了关键细节(使用这些 API)以允许它处理 Java:语法/解析器、Java 1.4-1.6 的完整符号表构造(1.7 暂时到期),以及一些控制和数据流分析(随着时间的推移而扩展,因为这些东西非常有用)。

通过使用 DMS 和 Java 前端提供的服务,可以合理地考虑构建任意 Java 分析和转换工具。 (这使得该工具成为“完整的”元编程工具,因为它可以检查任何语言结构或更改任何语言结构,而不是模板元编程或反射)。我们相信这比临时工具要有效得多,因为您不必构建基础架构,所提供的基础架构非常健壮,可以处理您没有精力实施的情况,并且旨在支持此类任务。 YMMV。

DMS/Java 前端已用于构建各种 Java 工具:测试覆盖率、分析器、死代码消除、大规模克隆检测、带有超链接源代码的 JavaDoc、快速 XML 解析器/生成器等。

是的,它积极维护;自 1998 年第一个版本以来一直在不断改进。

【讨论】:

  • 我以前听说过 ANTLR 和 javac API - 太难使用,而且 javac API 非常有限,所以唯一的选择是使用私有 com.sun.tools.javac 类,例如Lombok 可以,但它们可能随时更改,并且是 Oracle 的 javac 特定的。
  • 至于 JackPot - Internet 上关于它的大多数链接似乎都已失效。 :-( DMS 可能很有趣 - 我很快就会尝试,虽然有点遗憾,它似乎是一个付费工具。
  • @iirekm bitbucket.org/jlahoda/jackpot30/wiki/Home,它现在是 NetBeans 的一部分。
  • @iirekm:“有点可惜它是付费工具……”好吧,也许吧。如果它不是付费工具,它就不会存在;在开源社区中没有比这更好的了。
【解决方案2】:

有一个 Java 元编程框架是 Tapestry IOC 的一部分,它被称为 Plastic。它使用自定义类加载器来处理类字节码,我还没有尝试过,但它看起来提供了一个简单的接口,仍然使程序员能够进行强大的元编程更改。

【讨论】:

  • 谢谢,我试试。我希望这个周末我能有一些时间。
  • 我相信 URL 是 builds.apache.org/job/tapestry-trunk-freestyle/javadoc/…——另外,Tapestry 的一位提交者写了一系列关于塑料的博文,很有启发性:tawus.wordpress.com/category/plastic
  • 我快速浏览了塑料。有一个类似的工具叫做 Javassist (javassist.org) - 我不知道两者中哪一个在功能方面更好,但 Javassist 肯定更受欢迎并且有更好的文档。我在这里寻找更多 Lombok 风格的东西(projectlombok.org),但 Lombok 本身的设计很糟糕(例如,为了添加自定义转换,我们必须进行复制和粘贴以使其工作,例如:javac 和 Eclipse)。
  • @iirekm:javassist 处于较低的抽象级别。塑料的设计易于使用。
  • 他们的 API 看起来和我很相似,例如:PlasticClass -> CtClass, PlasticClassTransformer -> Transformer, pm.getClassInstantiator("plasticdemo.controlled.Foo").newInstance() -> classPool.get( "plasticdemo.controlled.Foo").toClass().newInstance(),plasticClass.introduceField -> ctClass.addField, ... 等等
【解决方案3】:

查看元编程系统:

http://www.jetbrains.com/mps/

它具有出色的 IDE 支持,JetBrains 的聪明人经常使用它。

【讨论】:

  • 我还没试过。它是否支持我的清单中的所有(或至少大部分)要求?
  • 我看了看。如果我理解得很好,它是一个用于设计 DSL,然后从中生成 Java 代码的框架。这里的“元编程”是指更一般的东西,不仅在编译时和运行时生成而且改变现有代码的行为。
【解决方案4】:

查看Spring Roo

【讨论】:

  • 这被标记为低质量答案。如果您只是要提供一个链接,那么最好作为评论。
猜你喜欢
  • 2011-06-09
  • 2018-05-02
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多