读书人

struts2拦截器兑现原理(转)

发布时间: 2012-10-06 17:34:01 作者: rapoo

struts2拦截器实现原理(转)
第一步:创建目标对象的接口

/**
* 目标对象的接口 JDK的动态代理要求目标对象必须实现一个接口
*
* @author 张明学
*
*/
public interface TargetInter {
public void doSomething();
}
第二步: 实现接口创建目标对象

/**
* 目标对象
*
* @author 张明学
*
*/
public class Target implements TargetInter {

public void doSomething() {
System.out.println("目标对象的方法执行!");
}

}

第三步:创建我们的拦截器对象

/**
* 拦截器对象
*
* @author 张明学
*
*/
public class Interceptor {
public void before() {
System.out.println("before方法执行!");
}

public void after() {
System.out.println("after方法执行!");
}
}

第四步:创建我们的处理器

/**
* 处理器类 JDK代理要求实现java.lang.reflect.InvocationHandler接口
*
* @author 张明学
*
*/
public class MyHandler implements InvocationHandler {
/**
* 目标对象
*/
private Object target;

public void setTarget(Object target) {
this.target = target;
}

/**
* 拦截器对象
*/
private Interceptor interceptor = new Interceptor();

/**
* invoke为真正执行的方法
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;

interceptor.before();

result = method.invoke(target, args);

interceptor.after();

return result;
}

}
第五步:创建代理对象

/**
* 代理对象
*
* @author 张明学
*
*/
public class MyProxy {
/**
* 得到对象的实例
* @param obj
* @return
*/
public Object getProxy(Object obj) {

MyHandler myHandler = new MyHandler();
myHandler.setTarget(obj);

/**
* 第一个参数:得到目标对象的class对象的ClassLoader
* 第二个参数:目标对象所实现的接口数组
* 第三个参数:真正执行的对象(处理器)
*/
return Proxy.newProxyInstance(Target.class.getClassLoader(), obj
.getClass().getInterfaces(), myHandler);
}

}

测试:

public class MyTest {

public static void main(String[] args) {
TargetInter targer = new Target();
MyProxy myProxy = new MyProxy();
/**
* 得到代理
*/
TargetInter proxy = (TargetInter) myProxy.getProxy(targer);


proxy.doSomething();
}

}

读书人网 >软件架构设计

热点推荐