Groovy AST-在编译时添加注释
我试图动态地包装一个注释,该注释将使用元编程和AST动态地向类中的每个字段添加@XmlElement注释。我在创建注释并将其正确应用于字段时遇到问题 我的代码格式如下:Groovy AST-在编译时添加注释,groovy,Groovy,我试图动态地包装一个注释,该注释将使用元编程和AST动态地向类中的每个字段添加@XmlElement注释。我在创建注释并将其正确应用于字段时遇到问题 我的代码格式如下: 我是不是完全错了?我这样做的原因是我有一个域仍在创建中,我只想进入并将注释应用于所有字段。找不到编译期间添加的任何批注示例。这是不可能的吗?仅使用Groovy AST转换编写代码不能与Grails重载机制一起工作。下面是为Grails应用程序实现AST转换的正确方法 您的transformer类必须扩展 您的transforme
我是不是完全错了?我这样做的原因是我有一个域仍在创建中,我只想进入并将注释应用于所有字段。找不到编译期间添加的任何批注示例。这是不可能的吗?仅使用Groovy AST转换编写代码不能与Grails重载机制一起工作。下面是为Grails应用程序实现AST转换的正确方法
@AstTransformer
注释org.codehaus.groovy.grails.compiler
或其子包下。在我的例子中,我使用了org.codehaus.groovy.grails.compiler.zk
,它运行良好shouldInject()
以仅匹配所需的类,在本例中为域类performInjection()
并在那里编写代码您的意思是将注释应用于域。是Grails域类吗?我的意思是,您打算在Grails环境中使用注释吗?是的,我将使用一些JAXBXML注释来生成SOAP服务。我想要的是WebresourceAnnotation注释,它将遍历域对象中的每个字段,并添加一个普通的XmlElement注释。非常感谢。我会看一看,看看我能想出什么。我陷入了无法确定如何实际创建AnnotationNode的困境。没问题。在变压器工作后,不要忘记接受它作为答案:)
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
}