实战 Groovy: 使用闭包、ExpandoMetaClass 和类别进行元编程
2009-11-19 00:00:00 来源:WEB开发网闭包和 ExpandoMetaClass
Groovy 提供了一种无害的但功能强大的语言特性 — 闭包 — 如果没有它的话,鸭嘴兽将永远无法下蛋。简单来说,闭包就是指定的一段可执行代码。它是一个未包含在类中的方法。清单 7 演示了一个简单闭包:
清单 7. 一个简单闭包def shout = {src->
return src.toUpperCase()
}
println shout("Hello World")
//output
HELLO WORLD
拥有一个独立的方法当然很棒,但是与将方法放入到现有类的能力相比,还是有些逊色。考虑清单 8 中的代码,其中并未创建接受 String 作为参数的方法,相反,我将方法直接添加到 String 类:
清单 8. 将 shout 方法添加到 StringString.metaClass.shout = {->
return delegate.toUpperCase()
}
println "Hello MetaProgramming".shout()
//output
HELLO METAPROGRAMMING
未包含任何参数的 shout() 闭包被添加到 String 的 ExpandoMetaClass (EMC) 中。每个类 — 包括 Java 和 Groovy — 都包含在一个 EMC 中,EMC 将拦截对它的方法调用。这意味着即使 String 为 final,仍然可以将方法添加到其 EMC 中。因此,现在看上去仿佛 String 有一个 shout() 方法。
由于 Java 语言中不存在这种关系,因此 Groovy 必须引入一个新的概念:委托(delegate)。delegate 是 EMC 所围绕的类。
首先了解到方法调用包含在 EMC 中,然后了解了 delegate,您就可以执行任何有趣的操作。比如,注意清单 9 然后重新定义 String 的 toUpperCase() 方法:
更多精彩
赞助商链接