【问题标题】:Create custom gradle plugin to analyze java source code and generate codes创建自定义 gradle 插件来分析 java 源代码并生成代码
【发布时间】:2019-09-16 05:29:36
【问题描述】:

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

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

【问题讨论】:

  • 对我来说,这听起来就像你真正想要做的是实现一个注释处理器。反射仅适用于已编译的类,否则您必须以某种方式解析该 java 源代码(可能为此使用某些库,从未研究过它)才能像通过反射一样分析/检查它。
  • @tjanu 是的。目标是查看带有注释的代码,然后在编译时使用插件生成更多代码

标签: java gradle code-generation gradle-plugin


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用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 类构建抽象语法树并对其进行更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 2021-01-21
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多