本篇的“Interceptor”,主要是来说说拦截器的阻止拦截的问题,这个问题是我们自定义拦截器时经常要遇到的挑战之一。
与阻止拦截很近的一个意思是不拦截,即我们可以拦截某个方法,但我们不对拦截做任何实质性的动作,即我们简单的将拦截的动作放行。这是一种被动的不拦截行为。而我们的阻止拦截却更为主动一些,即不让拦截器拦截到某个方法。
下面,我们将分别就放行拦截和阻止拦截来举例说明。
首先,我们还是设计一个需要被拦截的类来:
class Foo {
def foo()
{
println 'foo'
}
def bar()
{
println 'bar'
}
}
假设我们不想拦截“bar”方法,只想拦截“foo”方法,则我们可以这样设计拦截器:
class NoBarInterceptor implements Interceptor{
Object beforeInvoke(Object object, String methodName, Object[] arguments){
if(methodName == 'foo')
{
println 'interceptor the function: foo'
}
}
boolean doInvoke(){ true }
Object afterInvoke(Object object, String methodName, Object[] arguments,
Object result){
result
}
}
在代码中,我们只拦截了方法名为“foo”的方法,对其他方法则未做处理,即放行了。我们来写一点测试代码:
def proxy= ProxyMetaClass.getInstance( Foo )
proxy.interceptor= new NoBarInterceptor()
proxy.use{
def f= new Foo()
f.foo()
f.bar()
}
运行结果为:
interceptor the function: foo
foo
bar
当然了,如果我们想更加主动的确定对哪些方法放行,则可以这样设计我们的拦截器:
class NoMethodInterceptor implements Interceptor{
def methods
Object beforeInvoke(Object object, String methodName, Object[] arguments){
if(!(methodName in this.methods))
{
println "before invoking $methodName"
}
null
}
boolean doInvoke(){ true }
Object afterInvoke(Object object, String methodName, Object[] arguments,
Object result){
result
}
}