利用JDK动态代理机制实现简单的多层拦截器

首先JDK动态代理是基于接口实现的,所以我们先定义一个接口

public interface Executer {public Object execute(String param);
}

然后我们写一个类来实现该接口,我们将该类成为目标类。接下来我们将要对execute方法进行拦截!

public class SampleExecuter implements Executer {public Object execute(String param) {System.out.println("SampleExecuter.execute()");return "SampleExecuter.execute()" + param;}}

我们需要定义拦截器接口 Interceptor

public interface Interceptor {public Object intercept(Invocation invocation) throws Throwable;}

定义类 Invocation 该类负责调用我们目标对象的方法

public class Invocation {private Object target;private Method method;private Object[] args;public Invocation(Object target, Method method, Object[] args) {this.target = target;this.method = method;this.args = args;}public Object getTarget() {return target;}public void setTarget(Object target) {this.target = target;}public Method getMethod() {return method;}public void setMethod(Method method) {this.method = method;}public Object[] getArgs() {return args;}public void setArgs(Object[] args) {this.args = args;}public Object proceed() throws IllegalAccessException, InvocationTargetException {return method.invoke(target, args);}
}

代理类的实现

public class PlugIn implements InvocationHandler {private Object target;private Interceptor interceptor;public PlugIn(Object target, Interceptor interceptor) {this.target = target;this.interceptor = interceptor;}public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {return interceptor.intercept(new Invocation(target, method, args));}/*** 通过JDK动态代理Proxy.newProxyInstance返回代理对象* @param target 目标对象* @param interceptor 拦截器对象* @return 代理对象*/public static Object warp(Object target, Interceptor interceptor) {Class<?> type = target.getClass();return Proxy.newProxyInstance(type.getClassLoader(), type.getInterfaces(),new PlugIn(target, interceptor));}}

InterceptorChain 用来注册拦截器,并将拦截器与目标对象结合生成代理对象

public class InterceptorChain {private List<Interceptor> interceptors = new ArrayList<Interceptor>();public void addInterceptor(Interceptor interceptor) {interceptors.add(interceptor);}public Object pluginAll(Object target) {for (Interceptor interceptor : interceptors) {target = PlugIn.warp(target, interceptor);}return target;}
}

最后写俩个拦截器来测试我们的程序吧

public class IntOne implements Interceptor {public Object intercept(Invocation invocation) throws IllegalAccessException, InvocationTargetException {System.out.println("IntOne.intercept()-begin");Object result = invocation.proceed();System.out.println("IntOne.intercept()-end");return result;}}

public class IntTwo implements Interceptor {public Object intercept(Invocation invocation) throws IllegalAccessException, InvocationTargetException {System.out.println("IntTwo.intercept()-begin");Object result = invocation.proceed();System.out.println("IntTwo.intercept()-end");return result;}}

public class Demo {public static void main(String[] args) {SampleExecuter target = new SampleExecuter();InterceptorChain chain = new InterceptorChain();chain.addInterceptor(new IntOne());chain.addInterceptor(new IntTwo());Executer executer = (Executer) chain.pluginAll(target);Object result = executer.execute("params");System.out.println(result);}}

执行结果

IntTwo.intercept()-begin
IntOne.intercept()-begin
SampleExecuter.execute()
IntOne.intercept()-end
IntTwo.intercept()-end
SampleExecuter.execute()params

转载于:https://www.cnblogs.com/daxin/p/3351824.html

利用JDK动态代理机制实现简单拦截器相关推荐

  1. 深度剖析JDK动态代理机制

    摘要 相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象. 代理模式 使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过 ...

  2. AOP 拦截器 JDK动态代理机制 struts2 mybatis spring-aop

    struts2拦截器兑现原理(转) struts2拦截器实现原理(转) 第一步:创建目标对象的接口 /** * 目标对象的接口 JDK的动态代理要求目标对象必须实现一个接口 *  * @author ...

  3. 代理模式及JDK动态代理(InvocationHandler)的简单实现与分析

    在慕课网上学习了讲解代理模式的一个课程--<模式的秘密--代理模式>,感叹于David老师屌炸天的PPT,同时,老师一步一步模仿JDK源码去写code,教我们去简单实现JDK中的动态代理, ...

  4. 带你轻松搞懂JDK动态代理机制(ssm框架先行必备)

    学习动态代理之前需要先搞清楚静态代理,可以回看我之前在Mybatis里写的代理那一篇文章 MyBatis入门基础3 ---代理 动态代理 使用反射机制,在程序执行过程中,创建代理类对象,无需创建类文件 ...

  5. 通过JDK动态代理实现拦截器

    拦截器 拦截器是我们开发中接触比较多的.今天使用JDK动态代理模式来实现拦截器.实现过程我们通过代码来展示,代码中有相应的解释: //拦截器接口 public interface Intercepto ...

  6. AOP的底层实现-CGLIB动态代理和JDK动态代理

    AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来 ...

  7. JDK动态代理学习笔记

    2019独角兽企业重金招聘Python工程师标准>>> 昨天被问了个问题,问题的大意是这样的:为什么 Proxy.newProxyInstance(ClassLoader loade ...

  8. Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...

  9. JVM插桩之四:Java动态代理机制的对比(JDK和CGLIB,Javassist,ASM)

    一.class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件, ...

最新文章

  1. mysql定时任务如何每天0点跑_mysql定时任务,每天的零点执行一个存储过程
  2. PHP strlen()函数和strpos()函数
  3. 计算 java_两种计算Java对象大小的方法(转)
  4. php 子网掩码正则,验证子网掩码正则表达式代码范例
  5. mysql 字符集 校验规则_MySQL字符集及校验规则
  6. 使用Instruments中的CoreAnimation分析动画
  7. 前端常用插件、工具类库汇总,不要重复造轮子啦!!!
  8. RESTful API 设计规范
  9. IdentityServer4之Client Credentials(客户端凭据许可)
  10. 将Chrome浏览器默认保存离线网页为“多个文件”设置为“单个文件”即单个mhtml文件
  11. wps怎么做时间线_wps中的word文档如何制作时间轴
  12. 1002:方便记忆的电话号码
  13. freecodecamp小练习——Falsy Bouncer过滤数组假值
  14. Android11裁剪,Andorid 11调用系统裁剪
  15. Codeforces 833D Red-Black Cobweb 边分治
  16. Java 泛型方法/接口、泛型限定
  17. 电视盒子显示服务器未连接,你家的电视盒子直播总是卡,解决方法全都在这里...
  18. 向外国大师学习敏捷式开发?嫦娥掩面而笑
  19. 【查看】 - 内网(局域网)ip 、公网(外网)ip - ipconfig 、 tracert
  20. 每日新闻:徐小平:硬科技仍处在学习阶段;微软发布会定档10月2日 以升级现有产品线为主...

热门文章

  1. React Native 下载组件以及npm常用命令
  2. 【深度学习】EfficientNetV2分析总结和flops的开源库
  3. 【编译原理】递归下降的预测分析(真の能看懂~!)
  4. java for(o t :object) 获取顺序号_java中线程的生命周期
  5. python执行命令并返回结果集_Python接口测试结果集实现封装比较
  6. 如何更改mysql的授权信息_Mysql 的用户权限等操作管理与设置(创建、授权、修改、查看)...
  7. node 使用 download-git-repo 下载 github 代码
  8. 网络推广专员浅析在网站导航设计排版中应如何深入完成网络推广?
  9. 企业网络推广专员浅析企业网络推广中网站关键词排名优化有何技巧?
  10. 网络推广——网络推广专员如何提升企业网站转化率?