简单实现Struts2拦截器功能的模拟代码
TargerInterface:(目标接口,定义方法)
package com.interceptor;public interface TargerInterface {public void doSomething();}Target:(目标类,实现方法)?package com.interceptor;public class Target implements TargerInterface {public void doSomething() {System.out.println("do something in Target class...");}}?Interceptor:(拦截器类,写拦截前后需要处理的方法)package com.interceptor;public class Interceptor {public void before(){System.out.println("before...");}public void after(){System.out.println("after...");}}?MyHandler:(反射处理,将目标和拦截关联起来,这里开始耦合)package com.interceptor;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class MyHandler implements InvocationHandler {private Object object;private Interceptor interceptor = new Interceptor(); 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;}public void setObject(Object object) {this.object = object;}}?MyProxy:(代理类,实现反射加载)package com.interceptor;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:(测试类)package com.interceptor;public class Client {public static void main(String[] args) {TargerInterface target = new Target();MyProxy myProxy = new MyProxy();TargerInterface proxy = (TargerInterface)myProxy.getProxy(target);proxy.doSomething();}}?注意分析每个类之间的关系,理解反射与代理