从1.0版本开始,Groovy就支持通过invokeMethod和get/setProperty来拦截(intercept)所有方法和属性了。如果你只是想拦截导致运行失败的方法或属性的话,请参考使用methodMissing和propertyMissing。
在任何Groovy类中,你可以重载invokeMethod方法,它实质上会拦截所有的方法调用(要拦截已存在的方法的话,该类需要额外的实现GroovyInterceptable接口),这使构建有趣的DSL和生成器(builder)成为可能。
举例来说,你可以这样写一个没有意义的XmlBuilder(注意
:Goovy提供了许多强大的XML API,以下只是个例子而已):
class XmlBuilder { def out XmlBuilder(out) { this.out = out } def invokeMethod(String name, args) { out << "<$name>" if(args[0] instanceof Closure) { args[0].delegate = this args[0].call() } else { out << args[0].toString() } out << "</$name>" } } def xml = new XmlBuilder() xml.html { head { title "Hello World" } body { p "Welcome!" } }