Groovy:向闭包添加一个方法

时间:2016-01-07 16:31:31

标签: groovy closures metaprogramming

我有以下关闭

def closure = {
   println ("closure code")
}

我想为它添加一个方法。 但如果我试试

 closure.metaClass.fun = { c->
        c.call();
        println ("extra code");
 }   

我得到了例外

groovy.lang.MissingPropertyException: No such property: fun for class: org.codehaus.groovy.runtime.metaclass.ClosureMetaClass

读到另一个答案,我也盲目地试着打电话

ExpandoMetaClass.enableGlobally()

但它不起作用。

有没有办法实现我想要的东西?

2 个答案:

答案 0 :(得分:6)

你可以这样做:

def closure = {
    println "closure code"
}

closure.getMetaClass().fun = { ->
    delegate.call()
    println "extra code"
}   

closure.fun()

打印哪些:

closure code
extra code

答案 1 :(得分:2)

另一种更简单的方法可能是:

def closure = {    
    println "closure code" 
}  

closure.fun = { ->  
    closure()
    println "extra code" 
}     

closure.fun()

这种方法的缺点是我直接引用了闭包变量,而不是通过委托。