在Closure中,方法的默认解析顺序是,先查看owner是否包含这个方法,如果没有的话再查看delegate是否有这个方法。实际的过程要比这个复杂,因为涉及到嵌套的Closure的情况,在这种情况下,还要考虑外围的Closure的delegate。在这里就不讨论嵌套Closure的情况了,有兴趣的可以查看ClosureMetaClass.invokeMethod方法的源代码。
我们可以通过Closure的setResolveStrategy方法改变这个解析的顺序:
class C {
def f() { println 'C.f' }
def closure = { f() }
}
class D {
def f() { println 'D.f' }
}
def c = new C()
def d = new D()
c.closure.delegate = d
assert Closure.OWNER_FIRST == c.closure.getResolveStrategy()
c.closure() // 调用owner.f()
c.closure.resolveStrategy = Closure.DELEGATE_FIRST // 改变Closure的方法解析顺序
c.closure() // 调用delegate.f()
输出为:
C.f
D.f
除了OWNER_FIRST和DELEGATE_FIRST外,还有OWNER_ONLY、DELEGATE_ONLY和TO_SELF策略,在这里就不一一解析了,有兴趣的请查看
http://groovy.codehaus.org/api/groovy/lang/Closure.html。
上面的代码在Groovy 1.5.7中测试通过。
分享到:
相关推荐
Groovy 学习笔记 Groovy 学习笔记
Groovy
在学习任何东西之前,最重要的是培养兴趣,Groovy世界最耀眼的技术之一--Grails相信大家早已耳闻,我将通过Grails实战系列文章 向您展现Grails的迷人风采,使您感受到Grails的魅力,以至疯狂地爱上Grails,并坠入...
Groovy学习笔记,内容如下: 1.概念 2.基本语法 3.字符串 4.集合 5.类和闭包 6.控制语句 7.操作符重载 8.I/O操作 9.高级应用 10.正则表达式
对Groovy开发环境设置,基本语法做了简单明了的介绍
图文并茂,适合入门新手,涵盖了基本的语法讲解及一些DEMO测试,值得一看
NULL 博文链接:https://rsljdkt.iteye.com/blog/859059
Groovy学习资料-中文.rar。Groovy学习资料。Grails学习资料。mht网页格式。
Groovy语法&Gradle配置学习笔记
第1章 数字和字符串 第2章 List的简单介绍 第3章 String的特殊用法 第4章 闭包 第5章 集合+闭包 第6章 Map和Range 第7章 函数
Groovy_笔记
NULL 博文链接:https://key232323.iteye.com/blog/1336400
Grails Groovy 学习必备参考资料
很好的学习Groovy的学习资料, 很实用。。 个人感觉Groovy是Java敏捷开发的首选。
Groovy 调用 Java 类groovy 调用 Java class 十分方便,只需要在类前导入该 Java 类,在 Groovy 代码中就可以无缝使用该
脚本解析工具,可使用Groovy或Xquery解析JSON报文或XML报文
适合想了解groovy 编程开发的人员 Groovy - hellworld Groovy - 变量 Groovy - 静态import Groovy - 字符串 Groovy - 分支结构语句 Groovy - 循环结构语句
Groovy in action 中英文,API
groovy学习大礼包,包括groovy用户指南,groovy解惑,Groovy轻松入门