一个用来生成Java源代码的Java API

130

我正在寻找一个能生成Java源文件的框架。

类似于以下API:

X clazz = Something.createClass("package name", "class name");
clazz.addSuperInterface("interface name");
clazz.addMethod("method name", returnType, argumentTypes, ...);

File targetDir = ...;
clazz.generate(targetDir);

然后,在目标目录的子目录中应该可以找到一个Java源代码文件。

有人知道这样的框架吗?


编辑

  1. 我确实需要源代码文件。
  2. 我也想填写方法的代码。
  3. 我正在寻找高级抽象,而不是直接操作/生成字节码。
  4. 我还需要“类的结构”以对象树的形式呈现。
  5. 问题域是一般的:生成大量非常不同的类,没有“通用结构”。

解决方案
我已经发布了两个答案,基于您的答案...使用CodeModel使用Eclipse JDT

我在我的解决方案中使用了CodeModel,:-)


你的问题非常泛泛,你的问题领域真的这么广泛吗?你能更具体地描述你的问题领域吗?例如,我编写了代码生成工具,用于为特定问题生成代码,如消除重复的异常类代码或枚举中的重复项。 - Greg Mattes
@Vlookward:你可以把你已经放在问题中的答案作为两个单独的答案移到下面。然后从问题中添加一个链接到每个答案。 - Ande Turner
@Banengusk:谢谢你的提问,省去了我在互联网最黑暗的角落搜索数小时的时间。 @skaffman:太棒了,你让另一个开发者对即将到来的任务更加放心了 :) - Ran Biron
这个SO答案解决了C++而不是Java的问题,但是答案同样适用于Java。https://dev59.com/JIfca4cB1Zd3GeqPfSxI#28103779 - Ira Baxter
15个回答

1

我正在为一个模拟生成器工具自己编写代码。这是一个非常简单的任务,即使你需要遵循Sun格式指南。我敢打赌,你完成这个任务所需的时间比在互联网上找到符合你目标的东西还要快。

你基本上已经概述了API。现在只需填充实际代码即可!


呵呵呵...如果找不到框架,那我就得自己写了。我需要很多功能,所以一早上是完成不了的... - Daniel Fanjul

1

有一个名为 write-it-once 的新项目。它是一个基于模板的代码生成器。您可以使用 Groovy 编写自定义模板,并根据 Java 反射生成文件。这是最简单的生成任何文件的方式。您可以通过生成 AspectJ 文件来创建 getter/setter/toString,通过 JPA 注释生成 SQL,通过枚举生成插入/更新等。

模板示例:

package ${cls.package.name};

public class ${cls.shortName}Builder {

    public static ${cls.name}Builder builder() {
        return new ${cls.name}Builder();
    }
<% for(field in cls.fields) {%>
    private ${field.type.name} ${field.name};
<% } %>
<% for(field in cls.fields) {%>
    public ${cls.name}Builder ${field.name}(${field.type.name} ${field.name}) {
        this.${field.name} = ${field.name};
        return this;
    }
<% } %>
    public ${cls.name} build() {
        final ${cls.name} data = new ${cls.name}();
<% for(field in cls.fields) {%>
        data.${field.setter.name}(this.${field.name});
<% } %>
        return data;
    }
}

0

0

这真的取决于你想做什么。代码生成是一个独立的主题。如果没有具体的用例,我建议看一下Velocity代码生成/模板库。此外,如果您正在离线进行代码生成,我建议使用类似ArgoUML的工具,从UML图/Object模型转换为Java代码。


0

例子: 1/

private JFieldVar generatedField;

2/

String className = "class name";
        /* package name */
        JPackage jp = jCodeModel._package("package name ");
         /*  class name  */
        JDefinedClass jclass = jp._class(className);
        /* add comment */
        JDocComment jDocComment = jclass.javadoc();
        jDocComment.add("By AUTOMAT D.I.T tools : " + new Date() +" => " + className);
        // génération des getter & setter & attribues

            // create attribue 
             this.generatedField = jclass.field(JMod.PRIVATE, Integer.class) 
                     , "attribue name ");
             // getter
             JMethod getter = jclass.method(JMod.PUBLIC, Integer.class) 
                     , "attribue name ");
             getter.body()._return(this.generatedField);
             // setter
             JMethod setter = jclass.method(JMod.PUBLIC, Integer.class) 
                     ,"attribue name ");
             // create setter paramétre 
             JVar setParam = setter.param(getTypeDetailsForCodeModel(Integer.class,"param name");
             // affectation  ( this.param = setParam ) 
             setter.body().assign(JExpr._this().ref(this.generatedField), setParam);

        jCodeModel.build(new File("path c://javaSrc//"));

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