代理模式-静态动态代理-jdk动态代理-cglib动态代理

news2024/9/24 3:28:12

代理模式   静态代理  动态代理:jdk动态代理 cglib动态代理

注意 :下面的代码截图 要配合文字去看 我对代码的每一步都做了解释

所以需要配合图片观看提取吗1111icon-default.png?t=N7T8https://pan.baidu.com/s/1OxQSwbQ--t5Zvmwzjh1T0A?pwd=1111

这里直接把项目文件 及代码  给大家  不收费  可以下载之后对着下面的看  会增强理解


关于 代理模式:

代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介

举例子:

厂家的产品 无法直接卖给客户的时候 就需要中介  将厂家和客户联系起来  同时可以加价提高利润 类似这种就是代理模式

静态代理代码实现:

准备好  接口  接口的实现类【代理类】  目标类【也就是厂家】

建包如下:【自己发挥就行 】

封装学生类

【javabean javabean封装 就不截图了 正常一个Javabean那样去封装即可】

给它设置好空参 有参构造 以及相应的set get方法  还有自己的方法即可

封装老师类:

javabean封装 就不截图了 正常一个Javabean那样去封装即可

这里老师的功能也就是metting会议以及test测试方法  很简单只是打印了参数

  就是自己写的方法 这个做测试用的  自己发挥即可

接口【即老师想让学生代理他的职能】

学生代理【实现接口  拦截请求增强功能】

这个代理类 就是实现了上面的接口  可以帮助teacher类分担职能  。

这里看代码   我们对传入的参数 进行判断 这个就可以理解为功能增强 因为原本的老师类 并没有判断的功能 只有最简单的会见人员  【可以返回看一下老师类 的方法】

测试类:

可以看出来 静态代理的接口与实现类都是 我们用代码写死的,也就是说是固定的,也就是代理类是由程序写好 ,每一个代理代理一个内容,这样就会产生问题,随着代理的东西越来越多,造成资源浪费以及代码冗余


动态代理

“即可以在运行时 根据需要动态的去创建代理类   相对于静态代理的固定写死  它可以动态的根据需要自动创建代理  减少了内存资源浪费以及代码量

动态代理采用反射的机制,在运行时创建一个接口类的实例。可以统一对代码进行增强与管理。


Jdk动态代理

如何利用jdk实现动态代理

                 这里需要了解 Java的反射机制 以及它的jvm虚拟机才能更好的理解下面的内容

这里默认你具备基础  

Jdk动态代理是利用接口 以及无参构造自动的生成代理类

必须准备

接口 以及接口的实现类

以及一个实现类去实现Proxy所需要的InvocationHandel接口

这里的InvocationHandel就是去增强代理的功能以及控制代理的行为

接口:

实现类:

InvocationHandler

这里是对代理的行为进行控制

首先定义了一个object对象  并且通过Invocation的空参构造 注入了object  也就是我们接口的实现类 代理类

InvocationHandler的参数

  1. 指定代理类  也就是注入的那个代理
  2. 在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口【调用方法进行增强】
  3. 包含传入代理实例上方法调用的参数值的对象数组【传入参数】

测试类:

首先拿到接口的实现类 也就是代理类

将代理注入  进行控制

利用Proxy的方法newProxyInstance动态生成一个代理类

NewProxyInstance的参数  第一个参数就是指定类加载器,由谁来加载类

第二个参数就是通过反射拿到类的接口 ,第三个参数 就是我们的代理行为控制 也就是实现了InvoationHandler的控制类

动态生成之后  再向下转体 指向生成的代理类  【由于生成的类是Object类也就是所有类的父类】

就可以调用代理的方法 从而实现动态代理

CGLIB动态代理

这个CGLB动态代理,是一个第三方库【需要导入依赖】,比起jdk动态代理来说,它不在乎是否有代理的接口,而是通过直接对目标类实现继承,从而创建代理类。相对于jdk动态代理,更加便捷,适用范围更广。

建包如上:

一个cglib的行为控制器 继承的是MethodInterceptor

用于增强以及调用方法 这个与jdk类似  我命名为CGLIBlanjieqi

CglibProxy是抽出来的一个方法主要用于创建生成代理类

Student就是目标类  即需要代理的对象

Test即测试类

Student

MethodInterceptor:

Intercept:

参数:

  1. 代理对象
  2. * 2.方法
    * 3.参数
    * 4.调用代理对象【目标类的子类】或者目标对象的方法
  3. 不能在invokeSuper()

不能写具体的真实对象 因为会报错造成栈满 oom内存溢出  

Cglibproxy

实际上也可不抽出来 单独写也行

这里抽出来只是为了减少代码 看起来美观这样

这里是写了一个泛型的静态方法

为啥用静态方法?:最先被加载  不需要创建类的实例即可调用

然后继承传入的目标类

设置回调  也就是控制代理类的行为

最后成功目标类的代理类

返回代理类

测试类:

这里可以看到  调用了我们抽出来的方法 也就是cglibProxy.getproxy

创建了代理类 我们接收一下 即可调用代理的方法了


到此就学完了Jdk与cglib的动态代理

两者的区别:

动态代理的实现方案有两种,JDK动态代理和CGLIB动态代理,区别在于JDK自带的动态代理,必须要有接口,而CGLIB动态代理有没有接口都可以。

JDK动态代理:JDK原生的实现方式,需要被代理的目标类必须实现接口。因为这个技术要求代理对象和目标对象实现同样的接口(兄弟两个拜把子模式)。

cglib动态代理:通过继承被代理的目标类(认干爹模式)实现代理,所以不需要目标类实现接口。(CGLIB 通过动态生成一个需要被代理类的子类(即被代理类作为父类),该子类重写被代理类的所有不是 final 修饰的方法,并在子类中采用方法拦截的技术拦截父类所有的方法调用,进而织入横切逻辑。)
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1201758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 使用随记

Linux 使用随记 shell 命令行模式登录后所取得的程序被成为shell,这是因为这个程序负责最外层的跟用户(我们)通信工作,所以才被戏称为shell。 命令 1、命令格式 command [-options] parameter1 parameter2 … 1、一行命令中第…

FNPLicensingService.exe 总提示要联网

目录预览 一、问题描述二、原因分析三、解决方案:四、参考链接 一、问题描述 FNPLicensingService.exe 总提示要联网 找到路径如下: C:\Program Files (x86)\Common Files\Macrovision Shared\FlexNet Publisher然而从文件目录来看,并没有…

成都优优聚美团代运营:打造高效电商运营的利器

一、引人注目的标题 在繁杂的电商市场中,成都优优聚美团代运营以其专业的服务,为商家提供了一站式的解决方案。那么,这个备受瞩目的代运营平台有何特别之处呢?今天,我们就来一探究竟。 二、平台背景与优势 成都优优聚…

Electronica Samtec展台连接器Demo回顾 | 224Gbps PAM4:令人瞠目的速率

【摘要/前言】 最近,我们正在为大家带来2023慕尼黑上海电子展虎家展台Demo演示回顾系列。 今天虎家工程师团队再次为大家带来系列第一期: 我们邀请到了合作伙伴Keysight,与我们一同带来了Samtec NovaRay高密度、高性能阵列连接器以及Keysig…

微信小程序用户隐私API

用户隐私保护 由于用户隐私保护的政策执行,我们在调用涉及到用户隐私的API时,未更新用户隐私保护协议是无法直接调用的,小程序会默认判断是否更新用户隐私保护 ,并根据用户隐私保护中的协议来判断是否可以调用对应的API&#xff…

Generated Key 的功能

Generated Key 简介 一. 前言现场报错原因解决扩展 二. Generated Key简介:作用使用 一. 前言 现场报错 在客户现场遇到如下报错,现象是无法使用调度系统进行数据库的 insert 操作: 原因 数据库版本太老,而 insert 语句是使…

高性能图表库LightningChart JS v5.0 - 轻松实现图表自定义布局

LightningChart JS是Web上性能最高的图表库具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用,从而实现高刷新率和流畅的动画。 点击获取LightningChart JS v5.0正式版下载 LightningChart JS …

如何压缩文件?学会这4个简单方法!

“我有一些文件需要发送,但是文件太大了无法发送,我想把它们压缩但是不知道怎么操作。怎么压缩文件呢?谁能帮我出出主意呀?” 在数字化时代,文件传输和存储变得日益重要。压缩文件是一种有效的方式,可以减小…

清单式管理提高巡检质量——巡检管理系统体系化管理

巡检管理系统采用体系化的清单式管理方法,减少巡检工作中人为因素的误差,让巡检工作落实到细节,并有迹可查。 清单式管理是一种高效、系统化的巡检方法,广泛应用于各种行业和领域。通过制定详细的巡检清单,明确巡检内容…

MATLAB Simulink和SMART PLC水箱液位高度PID控制联合仿真

SMART PLC 向导PID的详细介绍请查看下面文章链接: S7-200 SMART PLC PID向导详细介绍(如何实现P、PD、PID控制器)-CSDN博客文章浏览阅读1k次。这篇博客主要介绍SMART PLC PID向导的使用,PID控制相关的其它内容请查看专栏系列文章,常用链接如下:SMART PLC PID负压控制(过程…

简洁高效的微信小程序分页器封装实践

前言 在现今的移动应用开发中,微信小程序已经成为了一个备受欢迎的平台。然而,随着应用的复杂性增加,数据的管理和加载成为了一个问题。本文将探讨微信小程序中的一个关键概念:封装分页器,它是提升小程序性能和用户体验…

windows qos api使用示例

简介 本文给出C版以及Rust版调用windows API实现QOS的示例,并提出一些注意事项。QOS可以用来区分socket 优先级、实现带宽控制等诸多功能。 UDP版本 该示例的重要部分是客户端应用程序。客户端代码的工作方式如下: 1. 通过套接字连接到目标 IP 地址。…

手把手教你数据流图如何画,轻松搞定!

数据流图是一种强大的工具,用于可视化和分析系统中的数据流动和处理过程。它不仅能够帮助我们更好地理解系统的功能和流程,还能够帮助我们发现和解决潜在的问题。在本篇文章中,我们将手把手教你掌握数据流图。 一、数据流图的概念和构成元素 …

合合信息亮相新加坡科技周——Big Data AI World Expo展示AI驱动文档数字化的前沿能力

展会规模背景: 2023年10月11日-12日,合合信息在TECH WEEK SINGAPORE(新加坡科技周)亮相,并在人工智能世界博览会(Big Data & AI World)展示合合信息核心人工智能文字识别技术能力。合合信息…

cadence virtuoso 导出电路图

去掉网格:option-display file-export image

FPGA高端项目:图像采集+GTX+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

目录 1、前言免责声明本项目特点 2、相关方案推荐我这里已有的 GT 高速接口解决方案我这里已有的以太网方案 3、设计思路框架设计框图视频源选择OV5640摄像头配置及采集动态彩条视频数据组包GTX 全网最细解读GTX 基本结构GTX 发送和接收处理流程GTX 的参考时钟GTX 发送接口GTX …

如何在电脑和手机设备上编辑只读 PDF

我们大多数人更喜欢以 PDF 格式共享和查看文件,因为它更专业、更便携。但是,通常情况下您被拒绝访问除查看之外的内容编辑、复制或评论。如果您希望更好地控制您的 PDF 或更灵活地编辑它,请弄清楚为什么您的 PDF 是只读的,然后使用…

Final Cut Pro X for Mac:打造专业级视频剪辑的终极利器

随着数字媒体技术的不断发展,视频剪辑已经成为各行各业不可或缺的一部分。Final Cut Pro X for Mac作为一款专业的视频剪辑软件,凭借其强大的功能和易用性,已经成为Mac用户的首选。本文将向您详细介绍Final Cut Pro X for Mac的优势、功能以及…

思维导图软件 Xmind mac中文版软件特点

XMind mac是一款思维导图软件,可以帮助用户创建各种类型的思维导图和概念图。 XMind mac软件特点 - 多样化的导图类型:XMind提供了多种类型的导图,如鱼骨图、树形图、机构图等,可以满足不同用户的需求。 - 强大的功能和工具&#…

C++——const成员

这里先用队列举例&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <assert.h> using namespace std; class SeqList { public:void pushBack(int data){if (_size _capacity){int* tmp (int*)realloc(a, sizeof(int) * 4);if (tm…