Groovy AST - 在编译时添加注释

时间:2013-01-24 17:24:02

标签: 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
}

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

1 个答案:

答案 0 :(得分:1)

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

  1. 您的变压器类必须扩展AbstractGrailsArtefactTransformer
  2. 您的变压器类必须由@AstTransformer注释。
  3. 您的班级必须放在org.codehaus.groovy.grails.compiler或其子包裹下。在我的情况下,我使用org.codehaus.groovy.grails.compiler.zk,它工作正常。
  4. 实施shouldInject()以仅匹配您想要的类,在本例中为域类。
  5. 覆盖performInjection()并在那里编写代码。
  6. 打包您的变换器并将类转换为 .jar 文件,否则Grails编译器不会加载它。