动态代理原理和设计模式详解

2023-09-15 18:14:55

bfd07ef984961e6a898e4e628d883726.jpeg

一、什么是代理模式

代理模式是一种设计模式,提供了对目标对象额外的访问方式,即可以通过代理访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的方式进行访问,扩展目标对象的功能。


通俗的说,例如你想租房,房子就是你的目标访问对象,那在中间的信息差巨大的情况下,你想要精准找到合适的房子,那么你可以找到中介,中介就是你的代理对象,用户通过中介完成租房的一系列操作(看房、交押金、租房、清扫卫生)。

二、动态代理模式

经典的动态代理模式分为两种:JDK动态代理和CGLIB动态代理模式

三、JDK动态代理实现方式

使用JDK动态代理的五大步骤:
1、通过实现InvocationHandler接口来自定义自己的InvocationHandler;
2、通过Proxy.getProxyClass获得动态代理类;
3、通过反射机制获得代理类的构造方法,方法签名为getConstructor(InvocationHandler.class);
4、通过构造函数获得代理对象并将自定义的InvocationHandler实例对象传为参数传入;
5、通过代理对象调用目标方法;


JDK静态代理和JDK动态代理的区别:
JDK静态代理与JDK动态代理之间有些许相似,比如说都要创建代理类,以及代理类都要实现接口等。
不同之处: 在静态代理中我们需要对哪个接口和哪个被代理类创建代理类,所以我们在编译前就需要代理类实现与被代理类相同的接口,并且直接在实现的方法中调用被代理类相应的方法;但是动态代理则不同,我们不知道要针对哪个接口、哪个被代理类创建代理类,因为它是在运行时被创建的。

四、CGLIB动态代理模式

CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类
1、首先实现一个MethodInterceptor,方法调用会被转发到该类的intercept方法。
2、然后在需要使用的时候,通过CGLIB动态代理获取代理对象两者的区别:JDK代理要求被代理的类必须实现接口,有很强的局限性。而CGLIB动态代理则没有此类强制性要求。
简单的说,CGLIB会让生成的代理类继承被代理类,并在代理类中对代理方法进行强化处理(前置处理、后置处理等)

五、海外动态代理

在了解底层的动态代理模式后,如何选择好用快速的动态代理:

1、选择代理池子大的。

代理池越大,代理ip数量越多,越能获得更多的信息

2、选择高匿名度的

越高的匿名度才越能保护我们的信息安全。ipfoxy动态代理超高匿名度,保证信息安全

3、选择更稳定的代理

稳定的代理才能保证业务的顺利进行,如果经常掉线或者数据无法上传/上传失败,会严重影响我们的数据安全以及业务的顺利进行


更多推荐

一个线程运行时发生异常会怎样?

如果一个线程在运行时发生异常而没有被捕获(即未被适当的异常处理代码处理),则会导致以下几种情况之一:线程终止:线程会立即终止其执行,并将异常信息打印到标准错误输出(System.err)。这通常包括异常的类型、堆栈跟踪信息以及异常消息。ThreadDeath异常:在某些情况下,特定类型的未捕获异常ThreadDeath

package.json属性

添加链接描述一、必须属性name定义项目的名称,不能以".“和”_"开头,不能包含大写字母version定义项目的版本号,格式为:大版本号.次版本号.修订号二、描述信息description项目描述keywords项目关键词author项目作者contributors项目贡献者homepage项目主页地址reposit

如何用一行CSS实现10种现代布局

现代CSS布局使开发人员只需按几下键就可以编写十分有意义且强大的样式规则。上面的讨论和接下来的帖文研究了10种强大的CSS布局,它们实现了一些非凡的工作。超级居中:place-items:center对于第一个“单行”布局,让我们解决所有CSS领域中最大的谜团:居中。我想让您知道,使用place-items:cente

网络安全(黑客)自学

前言我是去年8月22日才正式学习网络安全的,因为在国营单位工作了4年,在广东一个月工资只有5000块,而且看不到任何晋升的希望,如果想要往上走,那背后就一定要有关系才行。而且国营单位的气氛是你干的多了,领导觉得你有野心,你干的不多,领导却觉得你这个人不错。我才24周岁,实在的受不了这种工作氛围,情绪已经压制了很多久,一

2023-09-21 LeetCode每日一题(收集树中金币)

2023-09-21每日一题一、题目编号2603.收集树中金币二、题目链接点击跳转到题目位置三、题目描述给你一个n个节点的无向无根树,节点编号从0到n-1。给你整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间有一条边。再给你一个长度为n的数组coins,其

精品Python商铺摊位租赁管理系统

《[含文档+PPT+源码等]精品基于Python实现的商铺摊位管理系统设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等软件开发环境及开发工具:开发语言:python使用框架:Django前端技术:JavaScript、VUE.js(2.X)、css3开发工具:pycharm、Visu

CG-78静力水准仪采用压力传感器测量液体的压差

CG-78静力水准仪采用压力传感器测量液体的压差产品概述静力水准仪是测量两点间或多点间相对高程变化的仪器。由储液器、高精度芯体和特别定制电路模块、保护罩等部件组成。沉降系统由多个同型号传感器组成,储液罐之间由通气管和通液管相连通,基准点置于一个稳定的水平基点,当测点相对于基准点发生升降时,将引起各点压力的变化。通过测量

postman如何设置才能SwitchHosts切换host无缓存请求到指定ip服务

开发测试中,遇到多版本同域名的服务使用postman进行测试,一般会搭配SwitchHosts切换host类似工具进行请求,postman缓存比较重,如何做到无缓存请求呢,下面简单记录一下如何实现首先要知道如何当前请求服务的ip是哪个打开postman依次点击/menu/view/showpostmanconsole就

【操作系统笔记】进程间通信

Linux文件系统inode节点(indexnode):给每个文件赋予一个称为i节点的数据结构。inode一开始是存储在硬盘中的,只有当文件被打开的时候,其对应的i节点才加载到内存中。总结:Linux中,用户态通过读写文件的Api进行系统调用,在内核态中,上层是虚拟文件操作系统VFS,它为用户态提供统一接口,屏蔽底层实

Git 介绍、分布式版本管理软件介绍

文章目录一.分布式文件版本管理系统二、Git介绍2.1.Git的最基本使用2.2.工作中使用版本管理工具的经验2.3.Git的存储方式简介一.分布式文件版本管理系统在分布式文件版本管理系统到来之前,市面上的文件版本管理软件都是集中式的(svn就是典型的集中式文件版本管理系统),其软件会分为客户端软件和服务端软件两个部分

MySQL的备份与恢复

备份与恢复一、备份1.1数据备份的必要性1.2数据备份分类1.2.1物理备份1.2.2逻辑备份1.3数据库备份策略1.4常用的备份方法和工具1.5数据库上云迁移二、MySQL完全备份2.1简介2.2物理冷备份与恢复2.2.1物理冷备份2.2.2解压恢复2.3mysqldump备份与恢复1)完全备份一个或多个完整的库(包

热文推荐