通过JDK动态代理实现拦截器
拦截器
拦截器是我们开发中接触比较多的。今天使用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动态代理实现拦截器相关推荐
- 一文理解JDK静态代理、JDK动态代理、Cglib动态代理
代理模式 通过代理来访问真实的对象,而不是直接去访问真正干活的对象,比如二房东租房,二房是代理者,而一房东才是真正的房东:或者说生活中的中介.Spring中的AOP就是动态代理 适用场景 需要动态修改 ...
- 谁与争锋,JDK动态代理大战CGLib动态代理
文章目录 一.前言 二.基本概念 三.JDK 和 CGLib动态代理区别 3.1 JDK动态代理具体实现原理 3.2 CGLib动态代理 3.3 两者对比 3.4 使用注意 四.JDK 和 CGLib ...
- 利用JDK动态代理机制实现简单拦截器
利用JDK动态代理机制实现简单的多层拦截器 首先JDK动态代理是基于接口实现的,所以我们先定义一个接口 public interface Executer {public Object execute ...
- Spring 初识Aop JDK动态代理实现 原理初显
Spring 初识Aop JDK动态代理实现 原理初显 一.项目结构 二.具体步骤: 1.创建maven项目 创建好包结构 2.写一个TestDao接口 及实现类 3. 写一个自己的切面类 4.jav ...
- JDK 动态代理与 CGLIB 动态代理,它俩真的不一样
摘要:一文带你搞懂JDK 动态代理与 CGLIB 动态代理 本文分享自华为云社区<一文带你搞懂JDK 动态代理与 CGLIB 动态代理>,作者: Code皮皮虾 . 两者有何区别 1.Jd ...
- AOP的底层实现-CGLIB动态代理和JDK动态代理
AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来 ...
- 浅谈Spring中JDK动态代理与CGLIB动态代理
前言 Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式 ...
- Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理
文章目录 什么是代理模式 代理模式应用场景 代理的分类 静态代理 什么是静态代理 深入解析静态代理 小结 动态代理 什么是动态代理 JDK动态代理 原理和实现方式 代码实现 优缺点 Cglib动态代理 ...
- 使用反射生成 JDK 动态代理
反射 反射赋予了我们在运行时分析类和执行类中方法的能力. 通过反射,可以获取任意一个类的所有属性和方法,还可以调用这些方法和属性. 使用反射生成 JDK 动态代理 JDK 动态代理只能为接口创建动态代 ...
最新文章
- 主流浏览器内核介绍(前端开发值得了解的浏览器内核历史)
- SQLServer 客户端远程访问配置
- 【EasyUI】DataGrid实现表格的筛选过滤、排序
- PyCaret 2.0在这里-新增功能?
- Day03——类、值和对象
- Wi-Fi闪开,网速快 100 倍的Li-Fi要来了
- 别被忽悠了!我来谈谈大数据平台的4个要点,你们写的都不是干货
- 计算机操作系统英语,操作系统的英文介绍
- P1364 医院设置 洛谷
- GPS原始坐标转百度地图坐标(纯C代码)
- Spark大数据计算引擎介绍
- 如何将其他注册商处的域名申请转出并转入阿里云(图文教程)
- 都是热敏电阻,PTC和NTC的区别你真的知道吗?
- 解决“fatal: 'origin' does not appear to be a git repository...”
- python numpy是什么_Python库Numpy里ndarray.ndim 是什么意思?
- C++虚函数概念及使用(基础)
- BERT模型—1.BERT模型架构
- c++控制台工程,窗口最小化
- CUDA与cuDNN安装教程(超详细)
- 竞赛通知|首届工业数字孪生大赛
热门文章
- MySQL高可用之主备同步:javafor循环乘法表
- 第 11 章 直接内存
- c 不安装oracle,安装oracle 10g 的艰难之旅
- php 打包下载网络图片,php多张图片打包下载
- 计算机控制多少度,计算机控制中的模糊调度设计
- vscode中如何拉取git代码_工具 | 手把手教你在VSCode中使用Git
- 显示锁 java_第十三章:显示锁——Java并发编程实战
- 会计电算化是对用电子计算机处理,会计电算化的意义是什么
- 织梦怎样调取mysql_如何实现dedecms外部数据库调用
- 20210310 20210311 :栈、队列、堆类题目合集