无法使用 AST 转换将方法添加到 GORM 对象
Cannot get method added to GORM object using AST transformation
这是我的 GORM 对象
@UpdatedProperties
class Cart {
Date lastUpdated
Date dateCreated
String name
}
注释定义如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@GroovyASTTransformationClass(["UpdatedPropertiesASTTransformation"])
public @interface UpdatedProperties {
}
这是 AST 定义
@GroovyASTTransformation(phase = CompilePhase.CLASS_GENERATION)
class UpdatedPropertiesASTTransformation implements ASTTransformation{
//...
public void visit(ASTNode[] astNodes, SourceUnit sourceUnit) {
astNodes.findAll { node -> node instanceof ClassNode}.each {
classNode ->
def testMethodBody = new AstBuilder().buildFromString (
"""
println(">>*************myMethod)";
"""
)
def myMethod = new MethodNode('myMethod', ACC_PUBLIC, ClassHelper.VOID_TYPE, [] as Parameter[], [] as ClassNode[], testMethodBody[0])
classNode.addMethod(myMethod)
}
}
...
}
当我尝试调用我得到的方法时:
groovy.lang.MissingMethodException:没有方法签名:Cart.myMethod() 适用于参数类型:() 值:[]
感谢任何提示。谢谢
Class 生成为时已晚,无法在编译阶段向 class 添加方法,因此您需要将编译阶段更改为语义分析或规范化。 (无论如何,这可能比您想要添加方法晚得多。Groovy Compile Phase Guide)
您的 AST 字符串中也存在一些问题。你的 println 中有一个语法错误,println(">>*************myMethod)";
应该读作 println(">>*************myMethod");
,你需要添加一个明确的 return;
语句,因为你正在 returning [=13] =](否则 Groovy 将在您的方法末尾添加一个 return null;
,这将与您的 void
return 类型冲突)。
这是我的 GORM 对象
@UpdatedProperties
class Cart {
Date lastUpdated
Date dateCreated
String name
}
注释定义如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@GroovyASTTransformationClass(["UpdatedPropertiesASTTransformation"])
public @interface UpdatedProperties {
}
这是 AST 定义
@GroovyASTTransformation(phase = CompilePhase.CLASS_GENERATION)
class UpdatedPropertiesASTTransformation implements ASTTransformation{
//...
public void visit(ASTNode[] astNodes, SourceUnit sourceUnit) {
astNodes.findAll { node -> node instanceof ClassNode}.each {
classNode ->
def testMethodBody = new AstBuilder().buildFromString (
"""
println(">>*************myMethod)";
"""
)
def myMethod = new MethodNode('myMethod', ACC_PUBLIC, ClassHelper.VOID_TYPE, [] as Parameter[], [] as ClassNode[], testMethodBody[0])
classNode.addMethod(myMethod)
}
}
...
}
当我尝试调用我得到的方法时:
groovy.lang.MissingMethodException:没有方法签名:Cart.myMethod() 适用于参数类型:() 值:[]
感谢任何提示。谢谢
Class 生成为时已晚,无法在编译阶段向 class 添加方法,因此您需要将编译阶段更改为语义分析或规范化。 (无论如何,这可能比您想要添加方法晚得多。Groovy Compile Phase Guide)
您的 AST 字符串中也存在一些问题。你的 println 中有一个语法错误,println(">>*************myMethod)";
应该读作 println(">>*************myMethod");
,你需要添加一个明确的 return;
语句,因为你正在 returning [=13] =](否则 Groovy 将在您的方法末尾添加一个 return null;
,这将与您的 void
return 类型冲突)。