当前位置: 首页 > news >正文

Spring框架-GOF代理模式之JDK动态代理

我们可以分成三步来完成jdk动态代理的实现
第一步:创建目标对象
第二步:创建代理对象
第三步:调用代理对象的代理方法

public class Client {public static void main(String[] args) {//创建目标对象final OrderService target = new OrderServiceImpl();//创建代理对象OrderService proxyObj =(OrderService) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new TImerInvocationHandler(target)); /*{//参数1:Object proxy, 代理对象的引用// 参数2:Method method, 目标对象上的目标方法// 参数3:Object[] args ,目标方法上的实参*//*    @Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//这个接口的目的就是为了让你有地方写增强代码//并且,当调用代理对象的代理方法的时候,此方法才会被jdk调用。System.out.println("增强1");//  method.invoke(target,args );target.generate();System.out.println("增强2");return null;}}*//*);*///调用代理对象的代理方法proxyObj.generate();proxyObj.detail();proxyObj.modify();}}

创建代理对象时,我们传入的第三个参数就是实现InvocationHandler接口的实现类,重写invoke方法,就是让我们写增强功能的地方,代码如下:

public class TImerInvocationHandler implements InvocationHandler {private final OrderService target;public TImerInvocationHandler(OrderService target) {this.target = target;}//参数1:Object proxy, 代理对象的引用// 参数2:Method method, 目标对象上的目标方法// 参数3:Object[] args ,目标方法上的实参@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//这个接口的目的就是为了让你有地方写增强代码//并且,当调用代理对象的代理方法的时候,此方法才会被jdk调用。long begin = System.currentTimeMillis();Object retvalue = method.invoke(target, args);long end = System.currentTimeMillis();System.out.println("耗时"+(end-begin)+"毫秒");//返回值。这样才能保证目标方法中有返回值的方法在代理对象调用方法时可以拿到返回的值return retvalue;}
}

在上述操作之前先创建相关类和接口,下方为简单示例:

//公共接口
public interface OrderService {void generate();void modify();void detail();
}
//实现类
public class OrderServiceImpl implements OrderService {@Overridepublic void generate() {try {Thread.sleep(456);}catch (InterruptedException e){e.printStackTrace();}System.out.println("订单已生成");}@Overridepublic void modify() {try {Thread.sleep(666);}catch (InterruptedException e){e.printStackTrace();}System.out.println("订单已修改");}@Overridepublic void detail() {try {Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}System.out.println("订单详情");}
}
http://www.lryc.cn/news/259596.html

相关文章:

  • 基于JAVAEE技术校园车辆管理系统论文
  • 基于FFmpeg,实现播放器功能
  • 利用tf-idf对特征进行提取
  • 遇到运维故障,有没有排查和解决故障的正确流程?
  • javaWebssh汽车销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计
  • 基于pandoraNext使用chatgpt4
  • 12.视图
  • Leetcode69 x的平方根
  • 在Linux上安装配置Nginx高性能Web服务器
  • LeetCode 每日一题 Day 11||贪心
  • ocr表格文字识别软件怎么使用?
  • 【QT 5 调试软件+Linux下调用脚本shell-经验总结+初步调试+基础样例】
  • 使用 Goroutine 和 Channel 构建高并发程序
  • 大数据机器学习与深度学习——过拟合、欠拟合及机器学习算法分类
  • Lenovo联想拯救者Legion Y9000X 2021款(82BD)原装出厂Windows10系统
  • pytorch中的transpose用法
  • SpringBoot面试题及答案(最新50道大厂版,持续更新)
  • KUKA机器人如何隐藏程序或程序段?
  • C++ STL(1)--概述
  • unity 2d 入门 飞翔小鸟 死亡闪烁特效(十三)
  • Cannot find cache named ‘‘ for Builder Redis
  • IntelliJ IDEA的下载安装配置步骤详解
  • 光线追踪算法实现
  • 学习深度强化学习---第3部分----RL蒙特卡罗相关算法
  • linux虚拟机使用81-persistent-net.rule后接口名依然改变的问题处理
  • ARMV8 - A64 - 跳转和返回指令
  • QX320F28335,自研内核指令集,主频150MHz,自研工具链,纯国产DSP,硬件兼容TMS320F28335
  • 《使用ThinkPHP6开发项目》 - 登录接口一
  • zabbix精简模板
  • GO设计模式——14、代理模式(结构型)