使用动态代理和反射机制简单模拟struts2拦截器机制
- - ITeye博客根据动态代理的机制,先创建抽象类TargetInterface如下:. 创建目标对象Target实现抽象类如下:. 创建拦截器类(只是模拟,只写两个简单的方法)Interceptor如下:. 代理类方法执行类MyHandler如下:. 代理类MyProxy如下:. 最后测试类client如下:.
根据动态代理的机制,先创建抽象类TargetInterface如下:
public interface TargetInterface { public void doSomething(); }
创建目标对象Target实现抽象类如下:
public class Target implements TargetInterface { public void doSomething() { System.out.println("do something"); } }
创建拦截器类(只是模拟,只写两个简单的方法)Interceptor如下:
public class Interceptor { public void before() { System.out.println("before"); } public void after() { System.out.println("after"); } }
代理类方法执行类MyHandler如下:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyHandler implements InvocationHandler { private Object object; private Interceptor interceptor = new Interceptor(); public void setObject(Object object) { this.object = object; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; interceptor.before(); result = method.invoke(object, args); interceptor.after(); return result; } }
代理类MyProxy如下:
import java.lang.reflect.Proxy; public class MyProxy { public Object getProxy(Object object) { MyHandler myHandler = new MyHandler(); myHandler.setObject(object); return Proxy.newProxyInstance(Target.class.getClassLoader(), object .getClass().getInterfaces(), myHandler); } }
最后测试类client如下:
public class Client { public static void main(String[] args) { TargetInterface target = new Target(); MyProxy myProxy = new MyProxy(); TargetInterface proxy = (TargetInterface)myProxy.getProxy(target); proxy.doSomething(); } }
基本工作流程是:在测试类中声明抽象类的对象并且指向目标类的对象,声明一个代理类,调用代理类动态方法getProxy(target)方法,并且把生气的指向目标类的对象作为参数传进来,流程进入到getProxy方法当中如下
public Object getProxy(Object object) { MyHandler myHandler = new MyHandler(); myHandler.setObject(object); return Proxy.newProxyInstance(Target.class.getClassLoader(), object .getClass().getInterfaces(), myHandler); }
在方法体内声明了一个代理类的方法执行类的对象myHandler,并调用对象的set方法为对象object即抽象类的对象赋值,然后调用Proxy的newProxyInstance()方法,其中第一个参数被代理类的类加载器,第二个参数是Proxy的newProxyInstance方法返回的对象默认实现第二个参数所代表接口。第三个是方法处理类。当返回的对象调用方法时,会自动调用myHandler的invoke方法,调用myHandler类中的object即抽象类。