Struts2.0之类输入校验篇之六(拦截器中的动态代理)

来源:互联网 发布:大数据的建模分析 编辑:程序博客网 时间:2024/06/10 16:51

这儿先讲一下 动态代理,这个是Struts2拦截器实现的基础.

1>首先建立一个目标类的接口
package src;
public interface ITraget
{
   public void doSomething();
}

2>然后实现这个接口,建一个目标类
package src;
public class Traget implements ITraget
{
   public void doSomething()
   {
   System.out.println("doSomething is invoked!");
   }
}

3>再建一个拦截器,其实就是一个普通的类,加几个方法就是了

package src;
public class Intercepter
{
     public void doBefore()
     {
     System.out.println("doBefore");
     }
    
     public void doAfter()
     {
     System.out.println("doAfter");
     }
}

4>这儿需要一个东西,把拦截器和目标对象整合起来.实现目标对象的函数拦截.
   这儿的目标对象必须是可变的, 但是拦截器是不能变的
   也就是说,这个整合器和拦截器依赖的,和目标对象是不依赖的.
JDK已经给我们定义了一个接口,实现它就可以得到一个整合器
在JDK 1.5的API文档的索引那儿,输入"InvocationHandler"
可以看到反射的文档.
package src;
import java.lang.reflect.*;
public class MyHandler implements InvocationHandler
{
     //和目标对象是不依赖的
     private Object trgobj;
public void setObj(Object obj)
{
   this.trgobj = obj;
}
     //--整合器和拦截器依赖的
     private Intercepter intercepter = new Intercepter();
     //--实现这个invoke函数,但是那个Object proxy不小的来干什么的.
     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
     {
Object rlt = null;
    
this.intercepter.doBefore();
     rlt = method.invoke(this.trgobj, args);
     this.intercepter.doAfter();
    
     return rlt;
     }
}
5>还需要通过Proxy的一个静态方法newProxyInstance,传入目标对象,
   然后返回代理后的一个对象(这个代理后的对象就是加入了拦截器的)
这儿建一个类来包装这个方法:
package src;
import java.lang.reflect.*;
public class MyProxy
{
     public Object getProxy(Object trgObj)
     {
     MyHandler myHandler = new MyHandler();
    
     myHandler.setObj(trgObj);
    
     return Proxy.newProxyInstance(trgObj.getClass().getClassLoader(),
                             trgObj.getClass().getInterfaces(),
                             myHandler);
     }
}
6>好了,这下,写一个Client来测试就可以了.
package src;
public class Client {
/**
   * @param args
   */
public static void main(String[] args)
{
   //ITraget traget = new Traget();
  
   MyProxy proxy = new MyProxy();
  
   ITraget proxyTraget = (ITraget)proxy.getProxy(new Traget());
   proxyTraget.doSomething();
}
}

原创粉丝点击