实战 Groovy: 使用闭包、ExpandoMetaClass 和类别进行元编程
2009-11-19 00:00:00 来源:WEB开发网
清单 9. 重新定义 toUpperCase() 方法String.metaClass.shout = {->
return delegate.toUpperCase()
}
String.metaClass.toUpperCase = {->
return delegate.toLowerCase()
}
println "Hello MetaProgramming".shout()
//output
hello metaprogramming
这个操作看上去仍然有些不严谨(甚至有些危险!)。尽管现实中很少需要修改 toUpperCase() 方法的行为,但是想象一下为代码单元测试带来的好处?元编程提供了快速、简单的方法,使潜在的随机行为具有了必然性。比如,清单 10 演示了 Math 类的静态 random() 方法被重写:
清单 10. 重写 Math.random() 方法println "Before metaprogramming"
3.times{
println Math.random()
}
Math.metaClass.static.random = {->
return 0.5
}
println "After metaprogramming"
3.times{
println Math.random()
}
//output
Before metaprogramming
0.3452
0.9412
0.2932
After metaprogramming
0.5
0.5
0.5
现在,想像一下对发出开销较高的 SOAP 调用的类进行单元测试。无需创建接口和去掉整个模拟对象的存根 — 您可以有选择地重写方法并返回一个简单的模拟响应。(您将在下一小节看到使用 Groovy 实现单元测试和模拟的例子)。
Groovy 元编程是一种运行时行为 — 这个行为从程序启动一直持续到程序运行。但是如果希望对元编程进行更多的显示该怎么做(对于编写单元测试尤其重要)?在下一小节,您将了解揭秘元编程的秘密。
更多精彩
赞助商链接