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

2023-11-12

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、选择更稳定的代理

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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态代理原理和设计模式详解 的相关文章

  • OpenJDK 11 问题 - 客户端在上次 UNWRAP 之前完成握手

    我正在将代码库从 Oracle Java 1 8 0 131 迁移到 OpenJDK 11 0 1 我们有实现 nio ssl 套接字通道的代码 在 Java 8 中 客户端 服务器握手工作正常 在 Java 11 中 客户端在解包来自服务
  • 如何找出导致 poi 损坏 xlsx / xlsm 文件的原因

    我遇到的问题是 Apache POI 仅通过读取和写入就 损坏 了 xlsm xlsx 文件 例如使用以下代码 public class Snippet public static void main String args throws
  • 将 GAE/J 上的 pdfjet 生成的 PDF 文件上传到 Google Docs

    我需要将 PDF 文件上传到用户谷歌文档 该文件是由谷歌应用引擎上的 pdfjet 生成的 我想出使用 pdfjet for gae j 生成 pdf pdfjet 使用流来创建 pdf 无论如何 是否可以将流转换为文件 以便我可以上传给用
  • 添加@Named时@SessionScoped不起作用

    考虑以下支持 bean import javax faces bean ManagedBean import javax faces bean SessionScoped ManagedBean SessionScoped public c
  • 在 Java 中将日期从 UTC 转换为 PST

    我需要将日期从 Google App Engine 本地服务器时区转换为 Java 中的太平洋时间 我尝试使用 Calendar calstart Calendar getInstance calstart setTimeZone Time
  • Eclipse 调试“未找到源”

    我刚刚开始使用 Eclipse 所以慢慢来吧 但是 当尝试调试 JUnit 测试用例时 我会收到一个对话框 指出当我在测试方法中的代码中找到此行时 未找到源代码 Assert assertEquals 1 contents size 我知道
  • Java ASN.1 编译器

    现在我正在使用二进制笔记 http bnotes sourceforge net 解析 ASN 1 文件以在 Java 项目中使用 它采用 ASN 1 定义并生成 Java 类 让我可以操作 ASN 1 文件 我用扩展标记碰壁了 因为它不支
  • 如何在线程和小程序中使用双缓冲

    我有一个关于何时调用绘制和更新方法的问题 我有游戏小程序 我想在其中使用双缓冲 但我无法使用它 问题是 在我的游戏中 有一个球在 run 方法内移动 我想知道如何使用双缓冲来交换屏幕外图像和当前图像 请有人帮忙 当同时存在 update 和
  • Tomcat:Java 静态变量作用域、应用程序范围还是会话范围?

    java 静态变量是否在使用相同 web 应用程序的所有会话之间共享 或者每个会话都有自己的静态变量版本吗 换句话说 Tomcat 是为每个会话创建一组新的类 还是为整个 Web 应用程序创建一组新的类 Tomcat 创建一个ClassLo
  • HTTPURLConnection 不遵循从 HTTP 到 HTTPS 的重定向

    我不明白为什么JavaHttpURLConnection不遵循从 HTTP 到 HTTPS URL 的 HTTP 重定向 我使用以下代码来获取页面https httpstat us https httpstat us import java
  • 动态更新 LookAndFeel 值

    我希望能够动态更新 Swing GUI 的 LookAndFeel 属性 在本例中 我有一个简单的 Swing Awt 游戏 运行最初为 Nimbus 的游戏LookAndFeel 在启动后的各个时刻 我只想更改 比方说 一个细节 应用程序
  • 如何在Java中实现复合模式?

    我想实现一个复合模式Java以便绘制软件开发组织图 因此 我们假设有多个项目经理和多个开发人员 每个开发人员都被分配给一位项目经理 并且每个开发人员都能够使用各种编程语言进行编码 项目经理领导开发人员并准确了解他们的工作量 我对这个设计模式
  • Spring Boot 1.4:Liquibase完成后的执行方法

    我有一个基于 Spring Boot 1 4 0 的项目 该项目使用 Liquibase liquibase 完成后是否可以执行方法 像 Bean 后处理器之类的东西 我想要做的是当应用程序在开发模式下启动时向我的数据库添加一些数据 在开发
  • 调整 Java 类以提高 CPU 缓存友好性

    在设计java类时 对于实现CPU缓存友好性有哪些建议 到目前为止我学到的是应该尽可能多地使用 POD 即 int 而不是整数 这样 在分配包含对象时 数据将被连续分配 例如 class Local private int data0 pr
  • 计算事件之间的天数 - Android

    我一直在研究 Android API 并一直在寻找一种方法来计算当前日期和未来日期之间的天数 我对 android 还很陌生 而且我已经有几年没有做过 java 了 计算这个最简单的方法是什么 Thanks 最简单的方法是使用乔达时间 ht
  • Hibernate - 如何通过 Hibernate 将 java.net.URL 存储到数据库中

    我有一块田地URL countryURL in a Country班级 我想将其数据存储到COUNTRY通过 Hibernate 将表存储在数据库中 哪个休眠type我应该在休眠映射文件中使用
  • SSLHandShakeException 没有适当的协议

    我最近向我的网站添加了 SSL 可以通过 https 访问它 现在 当我的 java 应用程序尝试向我的网站发出请求并使用缓冲读取器从中读取时 它会生成此堆栈跟踪 我没有使用自签名证书 该证书来自 Namecheap 它使用 COMODO
  • 需要使用自定义类而不是在 Web 服务中生成(通过 wsimport)

    您能帮忙解决以下问题吗 当生成 WS 客户端代码 使用 wsimport ant 任务 时 所有类都会在与 Web 服务相同的包 例如 helloservice endpoint 中自动生成 例如如果我的网络服务有方法 公共节点 getNo
  • startDrag 方法 已弃用且无法编译程序

    startDrag android content ClipData android view View DragShadowBuilder java lang Object int 已弃用 如何解决这个问题而又不失去对旧版本的兼容性 还有
  • 如何使用 log4j2.xml 配置 hibernate 日志记录?

    我最近切换到 Apache log4j2 但仍然找不到使用 log4j2 xml 配置 hibernate 日志记录的方法 因为我找不到解决此问题的方法 所以我仍然显式使用 log4j properties 文件进行休眠 这不是最好的解决方

随机推荐