如何使用Groovy元编程向方法添加前置和后置代码?

如何使用Groovy元编程向方法添加前置和后置代码?,groovy,metaprogramming,Groovy,Metaprogramming,问题 有一个类MyClass带有一个方法myMethod()。如何添加一些代码,例如每次调用myMethod()之前执行的println“hello” 方法替换示例 我知道一个完整的方法可以像这样被替换 MyClass.metaClass.myMethod = { -> println "myMethod() has been replaced..." } 但是,我不想替换整个方法。我只想在方法前后添加一些代码。您可以执行以下操作: class MyClass { String na

问题

有一个类
MyClass
带有一个方法
myMethod()
。如何添加一些代码,例如每次调用
myMethod()
之前执行的
println“hello”

方法替换示例

我知道一个完整的方法可以像这样被替换

MyClass.metaClass.myMethod = { -> println "myMethod() has been replaced..." }

但是,我不想替换整个方法。我只想在方法前后添加一些代码。

您可以执行以下操作:

class MyClass {
  String name

  String expand() {
    "expanded $name"
  }
}

// Cache the old expand method
def oldExpand = MyClass.metaClass.getMetaMethod( 'expand', null )

// Create a new one
MyClass.metaClass.expand = { -> 
  // Do something
  println "Pre stuff"
  try {
    // then invoke and return the original method
    oldExpand.invoke( delegate )
  }
  finally {
    // finally doing something else
    println "Post stuff"
  }
}

def a = new MyClass( name:'tim' )

println "received: " + a.expand()

你可以这样做:

class MyClass {
  String name

  String expand() {
    "expanded $name"
  }
}

// Cache the old expand method
def oldExpand = MyClass.metaClass.getMetaMethod( 'expand', null )

// Create a new one
MyClass.metaClass.expand = { -> 
  // Do something
  println "Pre stuff"
  try {
    // then invoke and return the original method
    oldExpand.invoke( delegate )
  }
  finally {
    // finally doing something else
    println "Post stuff"
  }
}

def a = new MyClass( name:'tim' )

println "received: " + a.expand()