如何使用Groovy元编程将前后代码添加到方法中?

时间:2013-02-18 12:26:19

标签: groovy metaprogramming

问题

有一个类MyClass,其方法为myMethod()。如何添加一些代码,例如println "hello",每次在调用myMethod()之前执行?

方法更换示例

我知道可以像这样替换整个方法。

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

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

1 个答案:

答案 0 :(得分:4)

你可以这样做:

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()