如何通过配置脚本将“@POJO”应用到 类?

How to apply `@POJO` to classes via config script?

我有一些 classes 我想保留为 POJO。手动注释其中的每一个都会很麻烦,因为既要更新所有当前的又要添加将来的 classes.

我有一个 SourceAwareCustomizer 能够识别所有这些 class。但是我不知道如何通过配置脚本应用 @POJO

我试过 ast(POJO),但我会得到一个错误:

Provided class doesn't look like an AST @interface

我深入研究了一下代码,发现 @POJO 不是 AST 转换(它没有用 @GroovyASTTransformationClass 注释。

有没有办法通过配置脚本将 @POJO 或随机注释应用于 class?

POJO 不是 AST 转换。

比较POJO source to ToString(例如)。在 POJO 中,缺少 GroovyASTTransformationClass 注释..

没有@CompileStatic我无法让@POJO工作..

所以,这是我对 groovy 4.0.1 的尝试:

congig.groovy

import org.codehaus.groovy.ast.ClassNode
import org.codehaus.groovy.ast.AnnotationNode

import groovy.transform.stc.POJO
import groovy.transform.CompileStatic

withConfig(configuration) { 
   inline(phase:'SEMANTIC_ANALYSIS'){Object...args->
     if(args.size()>2){
       ClassNode cn = args[2]
       if( cn.getSuperClass().name=="java.lang.Object" ) {
         if( !cn.annotations.find{it.classNode.name==POJO.class.name} ) {
           cn.addAnnotation( new AnnotationNode(new ClassNode(POJO.class)) )
           //can't see how POJO could work without compile static in groovy 4.0.1
           if( !cn.annotations.find{it.classNode.name==CompileStatic.class.name} )
             cn.addAnnotation( new AnnotationNode(new ClassNode(CompileStatic.class)) )
         }
       }

       println "class       = $cn"
       println "annotations = ${cn.getAnnotations()}"
     }
   }
}

A.groovy

class A{
    String id
}

编译命令行:

groovyc --configscript config.groovy A.groovy

生成class

public class A
{
    private String id;
    
    @Generated
    public A() {}
    
    @Generated
    public String getId() {
        return this.id;
    }
    
    @Generated
    public void setId(final String id) {
        this.id = id;
    }
}