拦截器

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

//拦截器接口
public interface Interceptor {/*** 调用真实方法之前执行,写调用真实方法的前提逻辑* @param proxy 代理对象* @param obj 真实对象* @param method 方法* @param args 方法参数* @return*/public boolean before(Object proxy,Object obj,Method method,Object[] args);/*** 当before方法结果是false时,调用此方法* @param proxy* @param obj* @param method* @param args*/public void around(Object proxy,Object obj,Method method,Object[] args);/*** 调用完真实对象或者执行完around方法之后执行此方法* @param proxy* @param obj* @param method* @param args*/public void after(Object proxy,Object obj,Method method,Object[] args);}
//拦截器实现类
public class InterceptorImpl implements Interceptor {@Overridepublic boolean before(Object proxy, Object obj, Method method, Object[] args) {System.out.println("反射方法执行之前的逻辑~~");return false;}@Overridepublic void around(Object proxy, Object obj, Method method, Object[] args) {System.out.println("执行around方法~~~");}@Overridepublic void after(Object proxy, Object obj, Method method, Object[] args) {System.out.println("反射方法之后的逻辑~~");}
}
//JDK动态代理所需要的接口
public interface ISayHello {public void say();
}
//JDK动态代理接口实现类
public class SayHelloImpl implements ISayHello {@Overridepublic void say() {System.out.println("真实对象逻辑~Hello World!");    }}
//jdk动态代理实现拦截器
public class InterceptorJdkProxy implements InvocationHandler {//真实对象private Object obj;//拦截器权限定名private String interceptorClass = null;public Object bind(Object obj,String interceptorClas) {this.obj = obj;this.interceptorClass = interceptorClas;Object proxy = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);return proxy;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//如果没有拦截器,直接走原逻辑if(interceptorClass == null) {return method.invoke(obj, args);}//接收真实对象方法Object result = null;//反射生成拦截器对象Interceptor interceptor = (Interceptor) Class.forName(interceptorClass).newInstance();if(interceptor.before(proxy, obj, method, args)) {result = method.invoke(obj, args);} else {interceptor.around(proxy, obj, method, args);}interceptor.after(proxy, obj, method, args);return result;}
}
//测试代码
public class TestInterceptor {public static void main(String[] args) {InterceptorJdkProxy interceptorJdkProxy = new InterceptorJdkProxy();ISayHello bind = (ISayHello) interceptorJdkProxy.bind(new SayHelloImpl(), "interceptor.InterceptorImpl");bind.say();}
}

测试结果展示

当执行before方法返回为true

当执行before方法返回为false

通过JDK动态代理实现拦截器相关推荐

  1. 一文理解JDK静态代理、JDK动态代理、Cglib动态代理

    代理模式 通过代理来访问真实的对象,而不是直接去访问真正干活的对象,比如二房东租房,二房是代理者,而一房东才是真正的房东:或者说生活中的中介.Spring中的AOP就是动态代理 适用场景 需要动态修改 ...

  2. 谁与争锋,JDK动态代理大战CGLib动态代理

    文章目录 一.前言 二.基本概念 三.JDK 和 CGLib动态代理区别 3.1 JDK动态代理具体实现原理 3.2 CGLib动态代理 3.3 两者对比 3.4 使用注意 四.JDK 和 CGLib ...

  3. 利用JDK动态代理机制实现简单拦截器

    利用JDK动态代理机制实现简单的多层拦截器 首先JDK动态代理是基于接口实现的,所以我们先定义一个接口 public interface Executer {public Object execute ...

  4. Spring 初识Aop JDK动态代理实现 原理初显

    Spring 初识Aop JDK动态代理实现 原理初显 一.项目结构 二.具体步骤: 1.创建maven项目 创建好包结构 2.写一个TestDao接口 及实现类 3. 写一个自己的切面类 4.jav ...

  5. JDK 动态代理与 CGLIB 动态代理,它俩真的不一样

    摘要:一文带你搞懂JDK 动态代理与 CGLIB 动态代理 本文分享自华为云社区<一文带你搞懂JDK 动态代理与 CGLIB 动态代理>,作者: Code皮皮虾 . 两者有何区别 1.Jd ...

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

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

  7. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言 Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式 ...

  8. Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理

    文章目录 什么是代理模式 代理模式应用场景 代理的分类 静态代理 什么是静态代理 深入解析静态代理 小结 动态代理 什么是动态代理 JDK动态代理 原理和实现方式 代码实现 优缺点 Cglib动态代理 ...

  9. 使用反射生成 JDK 动态代理

    反射 反射赋予了我们在运行时分析类和执行类中方法的能力. 通过反射,可以获取任意一个类的所有属性和方法,还可以调用这些方法和属性. 使用反射生成 JDK 动态代理 JDK 动态代理只能为接口创建动态代 ...

最新文章

  1. 主流浏览器内核介绍(前端开发值得了解的浏览器内核历史)
  2. SQLServer 客户端远程访问配置
  3. 【EasyUI】DataGrid实现表格的筛选过滤、排序
  4. PyCaret 2.0在这里-新增功能?
  5. Day03——类、值和对象
  6. Wi-Fi闪开,网速快 100 倍的Li-Fi要来了
  7. 别被忽悠了!我来谈谈大数据平台的4个要点,你们写的都不是干货
  8. 计算机操作系统英语,操作系统的英文介绍
  9. P1364 医院设置 洛谷
  10. GPS原始坐标转百度地图坐标(纯C代码)
  11. Spark大数据计算引擎介绍
  12. 如何将其他注册商处的域名申请转出并转入阿里云(图文教程)
  13. 都是热敏电阻,PTC和NTC的区别你真的知道吗?
  14. 解决“fatal: 'origin' does not appear to be a git repository...”
  15. python numpy是什么_Python库Numpy里ndarray.ndim 是什么意思?
  16. C++虚函数概念及使用(基础)
  17. BERT模型—1.BERT模型架构
  18. c++控制台工程,窗口最小化
  19. CUDA与cuDNN安装教程(超详细)
  20. 竞赛通知|首届工业数字孪生大赛

热门文章

  1. MySQL高可用之主备同步:javafor循环乘法表
  2. 第 11 章 直接内存
  3. c 不安装oracle,安装oracle 10g 的艰难之旅
  4. php 打包下载网络图片,php多张图片打包下载
  5. 计算机控制多少度,计算机控制中的模糊调度设计
  6. vscode中如何拉取git代码_工具 | 手把手教你在VSCode中使用Git
  7. 显示锁 java_第十三章:显示锁——Java并发编程实战
  8. 会计电算化是对用电子计算机处理,会计电算化的意义是什么
  9. 织梦怎样调取mysql_如何实现dedecms外部数据库调用
  10. 20210310 20210311 :栈、队列、堆类题目合集