JDK动态代理实现拦截器
2017-12-31 00:00
441 查看
简介
待补充...step1:业务组件接口
package me.jtzen9; public interface UserService { void sayHelloWorld(); }
step2:业务组件实现类
package me.jtzen9; public class UserServiceImpl implements UserService { @Override public void sayHelloWorld() { System.out.println("hello world"); } }
step3:拦截器接口
package me.jtzen9.interceptor; import java.lang.reflect.Method; public interface Interceptor { boolean before(Object proxy, Object target, Method method,Object[] args); void around(Object proxy, Object target, Method method,Object[] args); void after(Object proxy, Object target, Method method,Object[] args); }
step4:拦截器实现类
package me.jtzen9.interceptor; import java.lang.reflect.Method; public class InterceptorImpl implements Interceptor { @Override public boolean before(Object proxy, Object target, Method method, Object[] args) { System.out.println("反射方法前逻辑"); return false; } @Override public void around(Object proxy, Object target, Method method, Object[] args) { System.out.println("取代了被代理对象的方法"); } @Override public void after(Object proxy, Object target, Method method, Object[] args) { System.out.println("反射方法后逻辑"); } }
step5:jdk动态代理结合拦截器
package me.jtzen9.interceptor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class InterceptorJdkProxy implements InvocationHandler { // 真实对象 private Object target; // 拦截器全限定名 private String interceptorClass = null; private InterceptorJdkProxy(Object target, String interceptorClass) { this.target = target; this.interceptorClass = interceptorClass; } public static Object bind(Object target, String interceptorClass) { return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InterceptorJdkProxy(target,interceptorClass)); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 如果没有设置拦截器,直接反射原方法 if (interceptorClass == null){ return method.invoke(target,args); } Object result = null; Interceptor interceptor = (Interceptor) Class.forName(interceptorClass).newInstance(); if (interceptor.before(proxy,target,method,args)) { result = method.invoke(target,args); } else { interceptor.around(proxy,target,method,args); } interceptor.after(proxy,target,method,args); return result; } }
step6:测试客户端
package me.jtzen9.interceptor; import me.jtzen9.UserService; import me.jtzen9.UserServiceImpl; public class ClientTest { public static void main(String[] args) { UserService userServiceProxy = (UserService) InterceptorJdkProxy .bind(new UserServiceImpl(), "me.jtzen9.interceptor.InterceptorImpl"); userServiceProxy.sayHelloWorld(); } }
结果
反射方法前逻辑 取代了被代理对象的方法 反射方法后逻辑
参考
用 Java 实现拦截器 Interceptor 的拦截功能《Java EE 互联网轻量级框架整合开发——SSM框架和Redis实现》
相关文章推荐
- 利用JDK动态代理机制实现简单拦截器
- 简单的Jdk动态代理实现:
- JDK的动态代理实现调用拦截器中的方法
- JDK解构 - Java中的引用和动态代理的实现
- Java的动态代理实现(JDK默认和CGLIB)
- 如何实现JDK动态代理?
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- JDK动态代理实现原理
- JDK动态代理实现原理
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- JDK动态代理实现原理
- Java动态代理之JDK实现和CGlib实现(简单易懂)
- spring(AOP)静态代理、JDK动态代理、cglib实现代理
- spring AOP的底层实现技术---JDK动态代理
- 利用jdk动态代理实现aop
- 拦截器与动态代理的实现
- JDK的动态代理实现调用拦截器中的方法
- JDK动态代理实现原理
- JDK和Cglib实现动态代理实例及优缺点分析
- jdk动态代理的实现原理