Groovy-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'. 正

我正在尝试使用AST转换替换类的方法

我首先检查该方法是否存在,然后将其删除()

我看到集合上的大小发生了变化,但在类节点上仍然可以访问该方法

删除该方法后,我想添加一个同名的新方法:

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
}