WEB开发网
开发学院软件开发Java 实战 Groovy: 使用闭包、ExpandoMetaClass 和类别... 阅读

实战 Groovy: 使用闭包、ExpandoMetaClass 和类别进行元编程

 2009-11-19 00:00:00 来源:WEB开发网   
核心提示: 闭包和 ExpandoMetaClassGroovy 提供了一种无害的但功能强大的语言特性 — 闭包 — 如果没有它的话,鸭嘴兽将永远无法下蛋,实战 Groovy: 使用闭包、ExpandoMetaClass 和类别进行元编程(4),简单来说,闭包就是指定的一段可执行代码

闭包和 ExpandoMetaClass

Groovy 提供了一种无害的但功能强大的语言特性 — 闭包 — 如果没有它的话,鸭嘴兽将永远无法下蛋。简单来说,闭包就是指定的一段可执行代码。它是一个未包含在类中的方法。清单 7 演示了一个简单闭包:


清单 7. 一个简单闭包
def shout = {src-> 
 return src.toUpperCase() 
} 
 
println shout("Hello World") 
 
//output 
HELLO WORLD 

拥有一个独立的方法当然很棒,但是与将方法放入到现有类的能力相比,还是有些逊色。考虑清单 8 中的代码,其中并未创建接受 String 作为参数的方法,相反,我将方法直接添加到 String 类:


清单 8. 将 shout 方法添加到 String
String.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() 方法:

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:实战 Groovy 使用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接