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();
}
}