文章目录
一、闭包的代理策略引入
二、闭包的四种代理策略
一、闭包的代理策略引入
分别在 Groovy 脚本 和 Test 类中定义 fun 方法 , 打印不同的内容 ;
在闭包 Closure 中分别调用上述两个方法 ,
代码示例 :
// I. 闭包中执行 Groovy 脚本中的方法 def fun() { println "fun" } def closure = { fun() } closure() // II. 闭包中执行 Test 类中的方法 class Test { def fun() { println "fun2" } } // 闭包中不能直接调用 Test 对象中的方法 // 此时可以通过改变闭包代理进行调用 def closure2 = { fun() } // 设置闭包的代理 closure2.delegate = new Test() // 执行闭包 closure2()
上述代码执行结果 :
执行上述代码后 , 两个闭包都执行的是 Groovy 脚本中的 fun 方法 ;
即使 closure2 闭包设置的是 Test 实例对象作为代理 , 其仍然执行的是 Groovy 脚本中的 fun 方法 ;
// 设置闭包的代理 closure2.delegate = new Test()
这是因为 Closure 闭包的 代理策略问题导致的 ;
在 Closure 闭包中 , resolveStrategy 成员配置的是该闭包的代理策略 , 默认的代理策略 OWNER_FIRST , 也就是优先从 owner 中查找方法 ; 此时即使在 delegate 中有 fun 方法 , 也会被 owner 中的 fun 方法覆盖 ;
private int resolveStrategy = OWNER_FIRST;
二、闭包的四种代理策略
闭包的四种代理策略 :
OWNER_FIRST : 所有者中的方法优先 ;
DELEGATE_FIRST : 代理优先策略 , 代理中的方法优先 ;
OWNER_ONLY : 只执行所有者中的方法 ;
DELEGATE_ONLY : 只执行代理中的方法 ;
TO_SELF : 只在自身查找 ;
public abstract class Closure<V> extends GroovyObjectSupport implements Cloneable, Runnable, GroovyCallable<V>, Serializable {