我试图动态地设置一个注释,它将动态地向类中的每个字段添加一个@XmlElement注释,使用元编程和AST。我在创建注释并正确地将它们应用于字段时遇到了问题。
我拥有的代码是在这里格式化的: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
}我是不是搞错了?我这么做的原因是,我有一个仍在酝酿中的域,我只想将注释应用到所有字段中。无法找到编译期间添加的注释示例。这不可能吗?
发布于 2013-01-28 10:17:31
仅使用Groovy转换编写代码并不适用于Grails重新加载机制。这里有一种为Grails应用程序实现AST转换的正确方法。
AbstractGrailsArtefactTransformer。@AstTransformer注释。org.codehaus.groovy.grails.compiler或它的子包下。在我的例子中,我使用了org.codehaus.groovy.grails.compiler.zk,它运行得很好。shouldInject()只匹配您想要的类,在本例中是域类。performInjection()并在那里编写代码。https://stackoverflow.com/questions/14507114
复制相似问题