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

java基础知识——27.动态代理

这篇文章,我们来学一下java的动态代理

目录

1.动态代理的介绍

2.具体的代码实现 


1.动态代理的介绍

动态代理:无侵入式的额外给代码增加功能

很不好理解,下面,我们通过两个例子来说明一下什么是动态代理:

例一:

如上图所示,我有一个学生类,里面有个方法,现在我想增强这个方法,即给这个方法增加点内容,怎么做?按照我们以前的思维肯定是直接把这些代码写进去就行,其实在实际开发中,这样做是很不对的,因为这样做很容易破坏代码的稳定性。

这时我们就可以用代理来做。 如下图所示:

 意思就是我们找个中介,这个中介先帮我们完成那些要增强的内容,然后我们再运行我们的内容。这个中介就是代理

例二:

假设,我们现在有一个明星,他会唱歌和跳舞,用我们程序表现出来就是一个明星类,里面有唱歌方法和跳舞方法。现在,我们要给这个方法增强,反映到实际上就是他跳舞前需要准备话筒,收钱;跳舞前需要准备场地,收钱。但是一个明星明显不会管这些事情,这时候这个明星就会去找经济公司,让经济公司帮他做这些事情,他只管唱跳就行。那么代理里面有什么内容呢?我们再结合实际想,一个活动邀请一个明星去参加,肯定是先和这个明星的经纪人联系,那么经纪人就要明码标价了啊,说明明星会哪些技能,会哪些歌曲,会哪些舞蹈。所以,代理里面一定有要代理类的方法。但是啊,经纪人不会唱跳啊,所以经纪人还要找明星,让明星去唱跳。所以,整个流程就是,我们外部需要调用这个增强的方法,我们应该去调用代理,然后让代理去调用原始类中的方法。

结合上面的内容,下面回答两个问题

问:程序为什么需要代理?代理长什么样?

答:对象如果嫌身上干的事情太多的话,可以通过代理来转义部分职责;对象有什么方法想被代理,代理就一定要有对应的方法。

问:代理如何知道你类要有哪些方法需要被代理呢?

答:通过接口知道的。我们类中所有要被代理的方法都要写在接口中,然后代理就能够通过接口知道有哪些方法需要被代理,然后实现它。其中,我们的类也要实现这个接口。

问:如果为java对象创建一个代理对象呢?

答:见下图:

2.具体的代码实现 

下面,我们就来看一下动态代理的具体代码实现:

标准JavaBean:

接口(里面写要代理的方法):

 

 具体的代理类:

 测试类:

测试结果:

下面说一下代码的整体执行流程:

第一步,运行主方法,创建BigStar类对象cxk,然后创建代理类对象proxy,传入BigStar类对象cxk,然后我们通过代理类对象来调用方法,视线来到左边,首先,我们调用java中Proxy类中的创建代理类对象的方法,里面有三个参数,第一个是加载代理类的,第二个是找代理方法的(就是接口),然后第三个是增强方法的,而第三方法中呢,我们又有代理类对象的参数(没啥用不用管),然后是代理方法的参数,看到右下角第16行,就是那个sing,然后还有方法的形参,也是那个16行,然后就进入方法里面,然后就直接执行方法了。这就是整个过程

有一说一,这东西看起来挺复杂的。大家尽量理解吧。如果上面有错误或者大家有什么好的想法可以在评论区留言。感谢大家。


http://www.kler.cn/a/17324.html

相关文章:

  • flutter下拉刷新上拉加载的简单实现方式三
  • 【R78/G15 开发板测评】串口打印 DHT11 温湿度传感器、DS18B20 温度传感器数据,LabVIEW 上位机绘制演化曲线
  • Python提取PDF和DOCX中的文本、图片和表格
  • Redis - 集群(Cluster)
  • CentOS 服务
  • TCP/IP协议,TCP和UDP区别
  • Linux指令大全——从零入门到实用工具
  • javaweb权限管理简单实现_javaweb管理系统项目
  • day21_IO
  • 使用 NutUI 搭建「自定义业务风格」的组件库 | 京东云技术团队
  • 【BeautifulSoup下】——05全栈开发——如桃花来
  • LeetCode:21. 合并两个有序链表
  • 1992-2022年31省GDP、第一产业增加值、第二产业增加值 第三产业增加值
  • 【51单片机】DS1302时钟模块
  • Office转换需要用到的SDK(建议)
  • 黑马点评项目导入
  • 操作系统内存管理笔记
  • nginx中使用absolute_redirect解决代理重定向问题
  • 【MySQL】数据库基础操作一:建库与建表
  • P4725 【模板】多项式对数函数(多项式 ln)
  • MobileNet(V1、V2、V3)入门
  • 状态机模式
  • 男子订民宿被毁约5个家庭漂泊街头 房东:住满了,没办法
  • Maven 知识点总结
  • 日撸 Java 三百行day38
  • Springboot +Flowable,任务认领和回退(一)