拦截器是调用方法的改进.当称某个实例是拦截器是,这是就其行为上而言的;
从代码的角度来看,拦截器就是一个类,这个类也包含方法,只是这个方法是个特殊方法,它会在目标方法调用之前“自动”执行。
//拦截器方法大都是通过代理的方式来调用的 //jdk动态代理只能对实现了接口的实例来生成代理,因此必须提供一个接口: public interface Dog { public void info(); public void run(); } //它的实现: public class DogImpl implements Dog { public void info() { System.out.println("我是一直猎狗!;); } public void run() { System.out.println("我奔跑迅速!;); } } //拦截dog实例的拦截器类: public class DogIntercepter { public void method1(){ System.out.println("111111111模拟通用方法一!;); } public void method2(){ System.out.println("222222222模拟通用方法二!;); } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class ProxyHandler implements InvocationHandler { private Object target; DogIntercepter di = new DogIntercepter(); public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { Object result = null; if(method.getName().equals("info")){ di.method1(); result = method.invoke(target, args); di.method2(); }else{ result = method.invoke(target, args); } return result; } public void setTarget(Object o){ this.target = o; } }
public class MyProxyFactory { public static Object getProxy(Object object){ ProxyHandler handler = new ProxyHandler(); handler.setTarget(object); //第一个参数是用来创建动态代理的ClassLoader对象,只要该对象能访问Dog接口即可 //第二个参数是接口数组,正是代理该接口的数组 //第三个参数是代理包含的处理实例 return Proxy.newProxyInstance(DogImpl.class.getClassLoader(), object.getClass().getInterfaces(), handler); } }主程序:
public class TestDog { public static void main(String[] args) { Dog targetObject = new DogImpl(); Dog dog = null; Object proxy = MyProxyFactory.getProxy(targetObject); if(proxy instanceof Dog){ dog = (Dog)proxy; } dog.info(); dog.run(); } }