Groovy AST-在编译时添加注释

Groovy AST-在编译时添加注释,groovy,Groovy,我试图动态地包装一个注释,该注释将使用元编程和AST动态地向类中的每个字段添加@XmlElement注释。我在创建注释并将其正确应用于字段时遇到问题 我的代码格式如下: 我是不是完全错了?我这样做的原因是我有一个域仍在创建中,我只想进入并将注释应用于所有字段。找不到编译期间添加的任何批注示例。这是不可能的吗?仅使用Groovy AST转换编写代码不能与Grails重载机制一起工作。下面是为Grails应用程序实现AST转换的正确方法 您的transformer类必须扩展 您的transforme

我试图动态地包装一个注释,该注释将使用元编程和AST动态地向类中的每个字段添加@XmlElement注释。我在创建注释并将其正确应用于字段时遇到问题

我的代码格式如下:


我是不是完全错了?我这样做的原因是我有一个域仍在创建中,我只想进入并将注释应用于所有字段。找不到编译期间添加的任何批注示例。这是不可能的吗?

仅使用Groovy AST转换编写代码不能与Grails重载机制一起工作。下面是为Grails应用程序实现AST转换的正确方法

  • 您的transformer类必须扩展
  • 您的transformer类必须由
    @AstTransformer
    注释
  • 类必须放在
    org.codehaus.groovy.grails.compiler
    或其子包下。在我的例子中,我使用了
    org.codehaus.groovy.grails.compiler.zk
    ,它运行良好
  • 实现
    shouldInject()
    以仅匹配所需的类,在本例中为域类
  • 重写
    performInjection()
    并在那里编写代码
  • 将转换器和相关类打包到.jar文件中,否则Grails编译器不会加载它

  • 您的意思是将注释应用于域。是Grails域类吗?我的意思是,您打算在Grails环境中使用注释吗?是的,我将使用一些JAXBXML注释来生成SOAP服务。我想要的是WebresourceAnnotation注释,它将遍历域对象中的每个字段,并添加一个普通的XmlElement注释。非常感谢。我会看一看,看看我能想出什么。我陷入了无法确定如何实际创建AnnotationNode的困境。没问题。在变压器工作后,不要忘记接受它作为答案:)
    import javax.xml.bind.annotation.XmlElement
    
    @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION)
    class WebserviceAnnotationModifier implements ASTTransformation {
    @Override
    void visit(ASTNode[] astNodes, SourceUnit sourceUnit) {
    
        if (!astNodes) return
        if (!astNodes[0] || !astNodes[1]) return
        if (!(astNodes[0] instanceof AnnotationNode)) return
        if (!(astNodes[1] instanceof ClassNode)) return
        ClassNode node = (ClassNode)astNodes[1]
        List fields = node.getFields()
        fields.each {FieldNode field ->
            field.addAnnotation(ClassHelper.make(new XmlElement.DEFAULT()));
        }
    }
    }
    
    @Retention(RetentionPolicy.SOURCE)
    @Target([ElementType.TYPE])
    @GroovyASTTransformationClass(classes =[WebserviceAnnotationModifier])
    public @interface WebresourceAnnotation{}
    
    @WebresourceAnnotation
    class TestPerson{
        String name;
        String lastName;
        int Age
    }