如何使用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()