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

一、什么是代理模式

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

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

二、动态代理模式

经典的动态代理模式分为两种: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、选择更稳定的代理

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

相关推荐
字节源流3 分钟前
关于maven的依赖下不下来的问题
java·maven
A5rZ30 分钟前
CSRF攻击 + 观测iframe加载时间利用时间响应差异侧信道攻击 -- reelfreaks DefCamp 2024
网络安全·csrf
pjx98734 分钟前
服务间的“握手”:OpenFeign声明式调用与客户端负载均衡
java·运维·spring·负载均衡
prinrf('千寻)1 小时前
MyBatis-Plus 的 updateById 方法不更新 null 值属性的问题
java·开发语言·mybatis
老华带你飞1 小时前
实习记录小程序|基于SSM+Vue的实习记录小程序设计与实现(源码+数据库+文档)
java·数据库·spring boot·小程序·论文·毕设·实习记录小程序
在未来等你2 小时前
互联网大厂Java求职面试:AI与大模型应用集成及云原生挑战
java·微服务·ai·kubernetes·大模型·embedding·spring ai
源码技术栈2 小时前
SaaS基于云计算、大数据的Java云HIS平台信息化系统源码
java·大数据·云计算·云his·his系统·云医院·区域his
编程、小哥哥2 小时前
互联网大厂Java面试:从Spring Boot到微服务架构的技术深挖
java·spring boot·redis·微服务·prometheus·面试技巧
揽你·入怀2 小时前
数据结构:ArrayList简单实现与常见操作实例详解
java·开发语言
okok__TXF2 小时前
SpringBoot3+AI
java·人工智能·spring