创建自定义gradle插件以分析Java源代码并生成代码

时间:2019-04-26 16:57:23

标签: java gradle code-generation gradle-plugin

我正在尝试创建一个插件来生成一些Java代码并将其写回到主源模块。我能够使用JavaPoet创建一些简单的pojo类,并将其写入src / main / java。

要使其有用,它应该从src / maim / java文件夹中读取代码,并使用反射来分析类。寻找一些注释,然后生成一些代码。我是否在这种情况下使用SourceTask?看来我只能通过文件访问类。是否可以将java类作为类读取并使用反射分析类?

2 个答案:

答案 0 :(得分:0)

由于您指定了要执行的操作: 您需要实现一个注释处理器。这与gradle完全无关,而gradle插件实际上是错误的解决方法。请查看Java注释处理器,如果有任何疑问,请再提出来。

答案 1 :(得分:0)

使用JavaForger,您可以读取输入类并基于该类生成源代码。它还提供了一个API,可以将其插入现有类或基于输入文件创建新类。与JavaPoet相比,JavaForger在要生成的代码与在何处以及如何插入代码的设置之间有明确的区分。一个pojo模板的示例如下所示:

public class ${class.name}Data {  

<#list fields as field>
  private ${field.type} ${field.name};
</#list>

<#list fields as field>
  public ${field.type} ${field.getter}() {
    return ${field.name};
  }

  public void ${field.setter}(${field.type} ${field.name}) {
    this.${field.name} = ${field.name};
  }
</#list>

}

下面的示例使用一个名为“ myTemplate.javat”的模板,并添加了一些额外的设置,例如创建不存在的文件,以及将创建文件的路径从* / path / *更改为* / pathToDto / *。输入类的路径被指定为读取the class name and fields and more

JavaForgerConfiguration config = JavaForgerConfiguration.builder()
    .withTemplate("myTemplate.javat")
    .withCreateFileIfNotExists(true)
    .withMergeClassProvider(ClassProvider.fromInputClass(s -> s.replace("path", "pathToPojo")))
    .build();
JavaForger.execute(config, "MyProject/path/inputFile.java"); 

如果您正在寻找一个允许以编程方式更多地更改代码的框架,那么您也可以查看JavaParser。使用此框架,您可以从Java类构造抽象语法树并对其进行更改。