首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy在编译时添加注释

Groovy在编译时添加注释
EN

Stack Overflow用户
提问于 2013-01-24 17:24:01
回答 1查看 1.2K关注 0票数 7

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

我拥有的代码是在这里格式化的:http://pastebin.com/60DTX5Ya

代码语言:javascript
复制
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
}

我是不是搞错了?我这么做的原因是,我有一个仍在酝酿中的域,我只想将注释应用到所有字段中。无法找到编译期间添加的注释示例。这不可能吗?

EN

回答 1

Stack Overflow用户

发布于 2013-01-28 10:17:31

仅使用Groovy转换编写代码并不适用于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编译器不会加载它。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14507114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档