当前位置: 首页 > 知识库问答 >
问题:

时髦 AST 转换 - 替换方法

谢昊乾
2023-03-14

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

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

MethodNode methodNode = parentClass.getMethod(methodName, Parameter.EMPTY_ARRAY)
if (methodNode != null) {
     parentClass.getMethods().remove(methodNode)
} 

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

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

parentClass.addMethod(newMethodNode)

但是,这会导致以下错误:

 Repetitive method name/signature for method 'grails.plugin.Bar getBar()' in class 'grails.plugin.Foo'.

正确的方法是什么?

更新:由于我打算做的就是替换该方法的现有功能,因此我创建了一个新的块语句,并使用 methodNode.setCode(语句)在现有方法上设置了它。

共有1个答案

刘奇
2023-03-14

听起来你想做的是用其他东西包装一个方法?下面是一个在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
}

除此之外,我帮不上忙,因为我以前从未尝试过移除一个方法:)

 类似资料:
  • 我目前正在尝试实现一些Groovy编译时AST转换,但遇到了麻烦: 如何为字段的赋值语句指定AST转换?i、 e.AST转换应转换以下代码: 变成类似的东西 我用这个AST构建器调用进行了尝试: 但在声明类的“init”方法中插入结果语句后,它反而插入了一个变量赋值,如 我浏览了Ast Builder TestCase中包含的示例,但它们只涵盖了类主体中的字段声明,而不是字段分配。我自己使用的尝试

  • 我正在寻找Groovy AST转换,它可以在我的类中生成构建器模式代码。 我知道有一些类似于< code>@Canonnical或< code>@ToString或< code>@EqualsAndHashCode的增强器可以自动生成有用的方法,希望有@GenerateBuilder。我想这样使用它:

  • 我写了我自己的AST转换,它应该生成getter和setter方法(在这里创建getter方法)。但是他们不工作,不能理解原因。 使用属性创建注释 我的AST转换代码应该为注释字段创建getter方法 注释检查 在哪个地方我犯了错误? 运行结果: 线程“main”groovy中出现异常。lang.MissingMethodException:没有方法ua的签名。家插科打诨。用法实例getMyCou

  • 我想开发一个Groovy AST转换,在某些类上添加一些方法。所以我写了一个注释类和相应的转换类。然后,我用我的Groovy AST注释来注释一个java类。 当我使用嵌入式时髦编译器编译 java 注释类时(例如,通过以下代码段:),执行转换并将方法添加到代码段中称为的已编译类中。 但我无法用Gradle groovy插件和Intellij IDEA正确编译java类。 问题:每个人都可以帮助我

  • 在我可以进一步回答之前,原始问题已被删除,因此我将问题与答案重新发布如下: 我无法使用AST转换修改我的方法,因为我无法在修改后执行前面的方法语句。我从方法中提取语句,将其保存在某个临时变量中,但在修改之后,当我尝试执行它时,得到MissingPropertyException:No such property:code for class:Calculator,就像我试图使用类中的属性,而不是方

  • 问题内容: 假设我的格式如下: 我想将小数点替换为空白,使其看起来像这样: 我该怎么做呢?我以为可以解决问题,但是当我尝试这样时: 我收到了一个错误消息,因为它可能不是字符。那是有道理的,那么我还能怎么完成我想要的? 问题答案: 如果您只是将单引号换成双引号,那么这将起作用,因为空字符串是合法值,而不是“空字符”,并且有重载。请记住,这是的超类型。