拦截对财产的调用

时间:2009-10-23 10:03:32

标签: groovy

我正在尝试拦截对Groovy类的属性的所有调用。由于这没有按预期工作,我创建了以下示例:

class TestClass {
    def getProperty(String key) {
        println "getting property: " + key
    }

    def invokeMethod(String method, args) {
        println "invoking method: " + method
    }

    def getFoo() {
        return 1
    }
}
tc.foo      // 1
tc.getFoo() // 2

1)做正确的事,就是调用getProperty。但是,2)工作(即返回1)但是既不调用getProperty也不调用invokeMethod。

是否有办法拦截getfoo()调用?

的Stefan

3 个答案:

答案 0 :(得分:0)

几个月前我写了一篇文章。你可以阅读它here

试试这段代码:

TestClass.metaClass.invokeMethod = {
   def metaMethod = delegate.metaClass.getMetaMethod(method,args)
   println "executing $method with args $args on $delegate"
   return metaMethod.invoke(delegate,args)
}

答案 1 :(得分:0)

我必须稍微修改前一个答案中的代码才能得到我想要的内容:

TestClass.metaClass.invokeMethod = {method, args ->
  def metaMethod = TestClass.metaClass.getMetaMethod(method,args)
  println "executing $method with args $args on $delegate"
  metaMethod.invoke(delegate,args) // could result in NPE
}

然后执行

tc.foo
tc.getFoo()

结果:

getting property: foo                               // println output
null                                                // getProperty return is null
executing getFoo with args [] on TestClass@655538e5 // invokeMethod output
1                                                   // metaMethod invocation

答案 2 :(得分:0)

问题是这里使用了两种不同的路径来处理请求。对于询问属性,在进入元类之前调用​​getProperty方法 - 如果覆盖getProperty,则必须自己进行元类调用。在invokeMethod的情况下,通常会在提出元类后询问。由于元类将响应您对getFoo()的请求,因此根本不会询问invokeMethod。如果让类实现GroovyInterceptable,则首先询问invokeMethod,方法与getProperty相同。这也解释了为什么使用元类的方法可以起作用。