完整的Java元编程框架?

完整的Java元编程框架?,java,metaprogramming,Java,Metaprogramming,我对元编程(即帮助程序员完成繁琐编程任务的程序)感兴趣。我正在寻找具有以下特性的工具: 在编译时和运行时都可用 检查程序结构 可以添加新的类、方法或字段,并使它们对Java编译器可见 可以改变方法的行为 基于Java(根据一些排名,Java是最流行的编程语言) 与IDE和Ant、Gradle或Maven等构建工具的良好集成 积极维护项目 易于使用和扩展 有一些解决方案,如: 倒影 AspectJ 注释处理工具 字节码操作(CGLIB、Javassist、java.lang.instrume

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

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

  • 倒影
  • AspectJ
  • 注释处理工具
  • 字节码操作(CGLIB、Javassist、java.lang.instrument)
  • Eclipse JDT
  • Groovy、JRuby、Scala

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

查看元编程系统:

它有很好的IDE支持,JetBrains的聪明人经常使用它。

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

这是Sun,呃,Oracle Java编译器的基于Java的编译器API。它们可能是主动维护的,但我认为您无法修改源代码并重新生成它。当然有符号表;对树一无所知。可能很难扩展;你必须跟上编译人员,而不是相反

有,它有一个Java实现和一个Java解析器来构建AST。我认为它没有完整的符号表,所以进行认真的代码分析/修订可能很困难。ANTLR当然是积极维护的,没有人会反对使用符号表增强Java语法。要知道,如果您只做了这些,那么Java1.6大约需要6个月的时间。(这就是我们内部的[smart]家伙为DMS做这件事花了多长时间,从1.4的符号表支持开始)

不在Java中,也不容易集成到IDE中,但能够对Java代码进行大规模分析和转换是我们的优势

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

Java前端向DMS提供了关键的细节(使用这些API),使其能够处理Java:语法/解析器,Java 1.4-1.6的完整符号表构造(1.7即将发布),以及一些控制和数据流分析(随着时间的推移将被扩展,因为这些东西非常有用)

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

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


对,积极维护,;自1998年第一个版本以来,它一直在不断增强。

请查看。

有一个Java元编程框架,它是Tapestry IOC的一部分,名为。它使用自定义类加载器来咀嚼类字节码,我还没有尝试过,但它似乎提供了一个简单的界面,仍然可以让程序员进行强大的元编程更改。

我将删除“你愿意和我一起为此启动一个新项目吗?”-部分。所以这不是讨论这个问题的合适地方。Groovy似乎符合这个要求。“Java编译器”不在运行时运行,除了热点之外,所以我不确定您想要在那里运行什么。那么什么地方更好?:-)这只是一个问题,不是项目规划,所以我认为这个地方还可以。@iirekm:我的建议是启动项目并将其放到Github上。没有什么比工作代码更能吸引贡献者了。@iirekm:Intelli-J有很好的Groovy支持。不管怎么说,Eclipse是一个垃圾,除了groovy,我还没有试过。它支持我清单中的所有(或至少大部分)需求吗?我看了一下。如果我理解得很好,它是一个设计DSL的框架,然后从中生成Java代码。这里所说的“元编程”是指更一般的东西,不仅在编译时和运行时生成而且更改现有代码的行为。我以前听说过ANTLR和javac API——太难使用,而javac API非常有限,所以唯一的选择是像Lombok一样使用私有com.sun.tools.javac类,但它们可能随时都会发生变化,而且是Oracle的javac特有的。至于JackPot,互联网上关于它的大多数链接似乎都没有了-(DMS可能非常有趣-我很快就会尝试它,尽管有点遗憾,它似乎是一个付费工具。@iirekm,它现在是NetBeans的一部分。@iirekm:“有点遗憾,它是一个付费工具…”嗯,也许吧。如果不是付费的工具,它就不存在了;在开源社区中没有比它更好的。谢谢,我会试试。我希望这个周末我有时间。我