Struts2拦截器原理分析

xiaoxiao2022-06-12  29

第一步:创建目标对象的接口

/**  * 目标对象的接口 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();     } }

转载请注明原文地址: https://www.6miu.com/read-4933432.html

最新回复(0)