我正在尝试动态创建一个注释,该注释将使用元编程和 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
注释. org.codehaus.groovy.grails.compiler
下或其子包。就我而言,我使用 org.codehaus.groovy.grails.compiler.zk
它工作正常。 shouldInject()
仅匹配您想要的类,在本例中为域类。 performInjection()
并在那里写下你的代码。 关于Groovy AST - 在编译时添加注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14507114/