三十一、4.2 Interceptor

Interceptor 可以对方法进行拦截,并提供机会在方法的前后添加切面代码,实现 AOP 的 核心目标。Interceptor 接口仅仅定了一个方法 void intercept(Invocation inv)。以下是简单的示例:

public class DemoInterceptor implements Interceptor {
    public void intercept(Invocation inv) { System.out.println("Before method invoking"); inv.invoke();
    System.out.println("After method invoking");
    }

以上代码中的 DemoInterceptor 将拦截目标方法,并且在目标方法调用前后向控制台输出 文本。inv.invoke()这一行代码是对目标方法的调用,在这一行代码的前后插入切面代码可以很 方便地实现 AOP。

nvocation 作为 Interceptor 接口 intercept 方法中的唯一参数,提供了很多便利的方法在拦 截器中使用。以下为 Invocation 中的方法:

方法

描述

void invoke()

传递本次调用,调用剩下的拦截器与目标方法

Controller getController()

获取 Action 调用的 Controller 对象(仅用于控制层拦截)

String getActionKey()

获取 Action 调用的 action key 值(仅用于控制层拦截)

String getControllerKey()

获取 Action 调用的 controller key 值(仅用于控制层拦截)

String getViewPath()

获取 Action 调用的视图路径(仅用于控制层拦截)

<T> T getTarget()

获取被拦截方法所属的对象

Method getMethod()

获取被拦截方法的 Method 对象

String getMethodName()

获取被拦截方法的方法名

Object[] getArgs()

获取被拦截方法的所有参数值

Object getArg(int)

获取被拦截方法指定序号的参数值

<T> T getReturnValue()

获取被拦截方法的返回值

void setArg(int)

设置被拦截方法指定序号的参数值

void setReturnValue(Object)

设置被拦截方法的返回值

boolean isActionInvocation()

判断是否为 Action 调用,也即是否为控制层拦截