我正在尝试拦截对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
答案 0 :(得分:0)
试试这段代码:
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相同。这也解释了为什么使用元类的方法可以起作用。