Groovy:如何传递closure作为参数来执行类中的方法

时间:2015-02-12 02:21:23

标签: groovy closures

我需要传递一个方法列表,用“闭包方式”在类中执行,参见下面的代码

 class A{
    def m1(){
      println "Method1"
    }

    def m2(){
      println "Method1"
    }

   def commands = { closure->
      println "before"
      closure.call()
      println "after"    
   }

}


A a = new A()
a.commands{
   println "before execute method m1"
   m1() //A need to execute m1 method of the class A
   println "after execute method m1"
}

当我评论m1()输出

  before
  before execute method m1
  after execute method m1
  after

否则抛出异常MissingMethodException: No signature of method for method m1()

因此,它无法将m1()方法识别为class A

的方法

1 个答案:

答案 0 :(得分:6)

根据你真正想要完成的事情,你可能需要这样的东西......

class A{
    def m1(){
        println "Method1"
    }

    def m2(){
        println "Method1"
    }

    def commands(closure) {
        def c = closure.clone()
        c.delegate = this
        println "before"
        c()
        println "after"
    }
}

委托有机会响应在闭包内部进行的方法调用。将委托设置为this将导致将m1()的调用分派到A的实例。您可能还有兴趣设置闭包的resolveStrategy属性。 resolveStrategy的有效值为Closure.DELEGATE_FIRSTClosure.OWNER_FIRSTClosure.DELEGATE_ONLYClosure.OWNER_ONLYowner是创建闭包的东西,无法更改。可以为delegate分配任何对象。当闭包进行方法调用时,方法可以由ownerdelegate处理,resolveStrategy在决定使用哪个方法时起作用。我认为名称DELEGATE_ONLYOWNER_ONLYDELEGATE_FIRSTOWNER_FIRST是不言自明的。如果您需要更多信息,请与我们联系。

我希望有所帮助。