使用invokeMethod和getProperty

使用invokeMethod和getProperty

从1.0版本开始,Groovy就支持通过invokeMethod和get/setProperty来拦截(intercept)所有方法和属性了。如果你只是想拦截导致运行失败的方法或属性的话,请参考使用methodMissing和propertyMissing

重载invokeMethod

在任何Groovy类中,你可以重载invokeMethod方法,它实质上会拦截所有的方法调用(要拦截已存在的方法的话,该类需要额外的实现GroovyInterceptable接口),这使构建有趣的DSL和生成器(builder)成为可能。

举例来说,你可以这样写一个没有意义的XmlBuilder(注意8-O: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!"
    }
}

重载getProperty和setProperty

你也可以重载属性访问通道——getProperty和setPropert方法,比如你可以按如下方式写一个没有意义的“Expandable”(可扩展)对象:

class Expandable {
    def storage = [:]
    def getProperty(String name) { storage[name] }
    void setProperty(String name, value) { storage[name] = value }
}
 
def e = new Expandable()
e.foo = "bar"
println e.foo
 
wiki/user_guide/using_invokemethod_and_getproperty.txt · 最后更改: 2008-09-23 00:09 由 johnny
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki