Groovy AST - 在编译时添加注释

标签 groovy

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

我的代码格式如下:http://pastebin.com/60DTX5Ya

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
}

我接近这一切都错了吗?我这样做的原因是我有一个仍在制作中的域,我想进入并将注释应用于所有领域。找不到在编译期间添加的任何注释示例。这不可能吗?

最佳答案

单独使用 Groovy AST Transformation 编写代码不适用于 Grails 重新加载机制。这是为 Grails 应用程序实现 AST 转换的正确方法。

  • 您的转换器类必须扩展 AbstractGrailsArtefactTransformer .
  • 您的转换器类必须由 @AstTransformer 注释.
  • 你的类(class)必须放在org.codehaus.groovy.grails.compiler下或其子包。就我而言,我使用 org.codehaus.groovy.grails.compiler.zk它工作正常。
  • 实现 shouldInject()仅匹配您想要的类,在本例中为域类。
  • 覆盖 performInjection()并在那里写下你的代码。
  • 包装您的转换器和相关类变成 .jar 文件,否则 Grails 编译器不会加载它。
  • 关于Groovy AST - 在编译时添加注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14507114/

    相关文章:

    groovy - 如果我用 (arg, ...args) 定义方法,参数将反转

    java - 使用 Spring Boot 在 Solr 中搜索逗号分隔的列表

    jenkins - 从给定 Jenkins 计算键的映射中获取常规值?

    templates - 如何给模板添加安全注解?

    java - 如何在 Groovy 脚本 - SoapUI 中使用 LinkedHashMap 集合?

    java - 在 Groovy 中读取流式 JSON

    grails - 在Grails中,如何创建一个域模型来链接另一个模型中的两个?

    jenkins - 从正在运行的版本中读取consoleText URL仅返回前10000行

    java - 在 Java 项目中与 Java 配对的最佳动态语言

    java - 了解与 Azure Groovy Java 一起使用的长轮询客户端逻辑