Groovy-AST转换-替换方法
我正在尝试使用AST转换替换类的方法 我首先检查该方法是否存在,然后将其删除() 我看到集合上的大小发生了变化,但在类节点上仍然可以访问该方法 删除该方法后,我想添加一个同名的新方法:Groovy-AST转换-替换方法,groovy,abstract-syntax-tree,Groovy,Abstract Syntax Tree,我正在尝试使用AST转换替换类的方法 我首先检查该方法是否存在,然后将其删除() 我看到集合上的大小发生了变化,但在类节点上仍然可以访问该方法 删除该方法后,我想添加一个同名的新方法: parentClass.addMethod(newMethodNode) 但是,这会导致以下错误: Repetitive method name/signature for method 'grails.plugin.Bar getBar()' in class 'grails.plugin.Foo'. 正
parentClass.addMethod(newMethodNode)
但是,这会导致以下错误:
Repetitive method name/signature for method 'grails.plugin.Bar getBar()' in class 'grails.plugin.Foo'.
正确的方法是什么
更新:
因为我打算做的只是替换该方法的现有功能,所以我创建了一个新的方法,并使用
methodNode在现有方法上设置它。setCode(statement)
听起来你想做的是用其他东西包装一个方法?下面是一个在try/finally中包装方法的示例
import org.codehaus.groovy.ast.*
import org.codehaus.groovy.ast.expr.*
import org.codehaus.groovy.ast.stmt.*
methodNode.setCode(methodThatCreatesAst(methodNode.getCode()))
def methodThatCreatesAst(Statement statementToWrap) {
BlockStatement methodBody = new BlockStatement()
methodBody.addStatement(new TryCatchStatement(
// try
statementToWrap,
// finally
new ExpressionStatement(
new MethodCallExpression(
"myVar", "myMethod", new ArgumentListExpression()
)
)
))
return methodBody
}
除此之外,我无法提供帮助,因为我以前从未尝试过删除某个方法:)我并不是试图将其包装,而是用新功能替换整个方法体。谢谢你的建议。
import org.codehaus.groovy.ast.*
import org.codehaus.groovy.ast.expr.*
import org.codehaus.groovy.ast.stmt.*
methodNode.setCode(methodThatCreatesAst(methodNode.getCode()))
def methodThatCreatesAst(Statement statementToWrap) {
BlockStatement methodBody = new BlockStatement()
methodBody.addStatement(new TryCatchStatement(
// try
statementToWrap,
// finally
new ExpressionStatement(
new MethodCallExpression(
"myVar", "myMethod", new ArgumentListExpression()
)
)
))
return methodBody
}