Java源代码生成框架

7
我有一组带有旧式Doclet标签、注释和注解的Java 5源文件。基于此,我想为另一组Java类编写生成器。最好的方法是什么?在Java中是否有任何好的独立代码分析/生成库?欢迎在这个领域分享经验。
到目前为止,我找到了以下内容:
- JaxME的Java Source Reflection - 看起来不错,但似乎不支持注解。而且自2006年以来没有发布过。 - Annogen - 使用JDK的Doclet生成器,在1.5 JDK下有一些错误。而且很长时间没有发布过。 - Javaparser - 也很不错,并且相当新,但只支持单个类的访问者模式,即没有像上述两个包中的查询机制。
4个回答

4
如果您只需要生成符合语法规范的Java代码,请查看Codemodel

Codemodel只是一个代码生成器,它没有解析Java代码的工具。不过链接加一分 :)。 - Andrey Adamovich
是的,它只是一个代码生成器,我想再次强调。非常适合我的口味的API。 - lexicore
1
URL似乎已更改为http://codemodel.java.net/。 - Henrik Aasted Sørensen
这是一个很棒的框架 - 但是,自将近两年以来,该项目似乎已经不再活跃。 - MRalwasser
Codemodel被用于XJC(来自JAXB RI的schema编译器),所以可以确信Oracle会继续支持它。 :) - lexicore
@lexicore 这是真的,但至少在java.net上似乎没有公开发生。邮件列表似乎已经死了,问题跟踪器上也没有任何回应。 - MRalwasser

3
我最终使用了PMD。以下是代码示例:
    final Java15Parser parser = new Java15Parser();
    final FileInputStream stream = new FileInputStream("VehicleServiceType.java");

    final Object c = parser.parse(new InputStreamReader(stream));

    final XPath xpath = new BaseXPath("//TypeDeclaration/Annotation/NormalAnnotation[Name/@Image = 'WebService']",
        new DocumentNavigator());

    for (final Iterator iter = xpath.selectNodes(c).iterator(); iter.hasNext();) {
      final Object obj = iter.next();
      // Do code generation based on annotations...
    }

感谢您的反馈,很高兴知道您可以使用XPath遍历类定义! - Tomislav Nakic-Alfirevic

1

NetBeans IDE和Eclipse JDT项目都具有相当的Java代码分析/生成逻辑。我不知道它们的依赖关系是什么(即,您是否可以将它们用作独立库),但除此之外,我会仔细查看这两个项目:很少有Java代码分析库正在更加密集地开发和更新。

更新:

PMD 也可能会引起兴趣:

PMD scans Java source code and looks for potential problems like:

* Possible bugs - empty try/catch/finally/switch statements
* Dead code - unused local variables, parameters and private methods
* Suboptimal code - wasteful String/StringBuffer usage
* Overcomplicated expressions - unnecessary if statements, for loops that could be while loops
* Duplicate code - copied/pasted code means copied/pasted bugs
此外,这篇博客文章讨论了各种静态代码分析工具。

Eclipse拥有JET(Java Emmiter Templates),但它无法在Eclipse之外工作(http://wiki.eclipse.org/JET_FAQ_How_do_I_run_a_JET_transformation_from_Java%3F)。 - Andrey Adamovich
我已经更新了我的答案,加入了一些新内容。 - Tomislav Nakic-Alfirevic
我尝试过使用PMD,但它的API有点太复杂了。我会继续实验并向您发布我的结果。 - Andrey Adamovich
我最终使用了PMD及其AST和XPath。 - Andrey Adamovich
发布一个单独的答案作为示例。 - Andrey Adamovich

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接