java拦截器-基于JDK动态代理实现
(接上一篇的JDK动态代理,续讲拦截器生成原理)
自定义拦截器接口:IMyInterceptor.java
public interface IMyInterceptor { boolean before(Object proxy, Object target, Method method, Object[] args); // 返回true时执行反射真实对象的方法;返回false执行around()方法 int around(Object proxy, Object target, Method method, Object[] args); void after(Object proxy, Object target, Method method, Object[] args); }
自定义拦截器类(实现接口):MyInterceptor.java
public class MyInterceptor implements IMyInterceptor { @Override public boolean before(Object proxy, Object target, Method method, Object[] args) { System.out.println("反射方法前逻辑"); return false; } @Override public int around(Object proxy, Object target, Method method, Object[] args) { System.out.println("取代了反射方法"); return 1; } @Override public void after(Object proxy, Object target, Method method, Object[] args) { System.out.println("反射方法后逻辑"); } }
使用JDK动态代理实现的拦截器:InterceptorJdkProxy.java(implements InvocationHandler)
public class InterceptorJdkProxy implements InvocationHandler { private Object target; private String interceptorClass = null; // 拦截器全限定名 public InterceptorJdkProxy(Object target, String interceptorClass) { this.target = target; this.interceptorClass = interceptorClass; } /** * 绑定真实对象和代理对象 * * @param target * @param interceptorClass * @return */ public static Object bind(Object target, String interceptorClass) { return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InterceptorJdkProxy(target, interceptorClass)); } /** * 通过代理对象调用方法 * * @param proxy * @param method * @param args * @return * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (interceptorClass == null) { return method.invoke(target, args); // 直接反射原有方法 } Object result = null; MyInterceptor interceptor = (MyInterceptor) Class.forName(interceptorClass).newInstance(); // 通过反射方式生成拦截器对象 if (interceptor.before(proxy, target, method, args)) { result = method.invoke(target, args); } else { result = interceptor.around(proxy, target, method, args); } interceptor.after(proxy, target, method, args); return result; } }
测试查看效果:TestInterceptor.java
public class TestInterceptor { public static void main(String[] args) { HelloWorld proxy = (HelloWorld) InterceptorJdkProxy.bind(new HelloWorldImpl(), "com.ssm.dynamicProxy.MyInterceptor"); proxy.sayHello(); } }
输出:
反射方法前逻辑
取代了反射方法
反射方法后逻辑