两种动态代理比较(补充),进程通信方式总结

jdk和CGLib动态代理:

jdk动态代理:

  • java提供的动态代理技术;

  • spring aop默认采用的方式;

  • 只能对实现了至少一个接口的类生成代理对象;

CGLib动态代理:

  • 采用底层字节码技术;

  • 目标对象没有实现接口时采用;

在性能方面,CGLib创建的代理对象比JDK动态代理创建的代理对象高很多。

但是,CGLib在创建代理对象时所花费的时间比JDK动态代理多很多。

所以,对于单例的对象因为无需频繁创建代理对象,采用CGLib动态代理比较合适。

反之,对于多例的对象因为需要频繁的创建代理对象,则JDK动态代理更合适。

CGLib动态代理是在运行时通过创建目标类的子类来生成代理对象的。

CGLib(Code Generation Library)是一个基于类继承的代理库,它通过生成目标类的子类来实现代理。具体步骤如下:

  1. 首先,需要引入CGLib的相关依赖。

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>xxx</version>
</dependency>
  1. 创建一个MethodInterceptor对象,用于拦截目标方法的调用。

public class MyInterceptor implements MethodInterceptor {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {// 在目标方法执行前后进行拦截操作// ...Object result = proxy.invokeSuper(obj, args);// ...return result;}
}
  1. 使用Enhancer类创建代理对象。

Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(YourClass.class);
enhancer.setCallback(new MyInterceptor());
YourClass proxy = (YourClass) enhancer.create();

在上述代码中,YourClass是目标类,MyInterceptor是自定义的拦截器。通过Enhancer类的setSuperclass()方法设置目标类,setCallback()方法设置拦截器,最后通过create()方法创建代理对象。

  1. 使用代理对象进行方法调用。

proxy.yourMethod();

在运行时,CGLib会动态生成目标类的子类,并重写目标类中的方法。当调用代理对象的方法时,实际上是调用了子类中重写的方法,然后在拦截器中进行拦截操作。

总结来说,CGLib动态代理是在运行时创建子类代理的实例,通过继承目标类来生成代理对象,并在拦截器中进行方法拦截和增强。相比于JDK动态代理,CGLib能够代理非接口类,但代理过程中需要创建子类,可能会对性能产生一定影响。

JDK动态代理是在运行时通过创建接口的代理类来生成代理对象的。

JDK动态代理是通过Proxy类和InvocationHandler接口来实现的。具体步骤如下:

  1. 创建一个实现InvocationHandler接口的类,用于拦截目标方法的调用。

public class MyInvocationHandler implements InvocationHandler {private Object target;
​public MyInvocationHandler(Object target) {this.target = target;}
​@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 在目标方法执行前后进行拦截操作// ...Object result = method.invoke(target, args);// ...return result;}
}
  1. 使用Proxy类创建代理对象。

YourInterface proxy = (YourInterface) Proxy.newProxyInstance(YourInterface.class.getClassLoader(),new Class[]{YourInterface.class},new MyInvocationHandler(target)
);

在上述代码中,YourInterface是目标接口,MyInvocationHandler是自定义的拦截器。通过Proxy类的newProxyInstance()方法创建代理对象,需要传入目标接口的类加载器、目标接口数组和拦截器对象。

  1. 使用代理对象进行方法调用。

proxy.yourMethod();

在运行时,JDK动态代理会动态生成一个实现了目标接口的代理类,并在代理类中重写了目标接口中的方法。当调用代理对象的方法时,实际上是调用了代理类中重写的方法,然后在拦截器中进行拦截操作。

总结来说,JDK动态代理是在运行时创建接口的代理实例,通过实现目标接口的代理类来生成代理对象,并在拦截器中进行方法拦截和增强。相比于CGLib动态代理,JDK动态代理只能代理接口,但代理过程中无需创建子类,相对更轻量级。

invoke()`方法

invoke()方法是在InvocationHandler接口中定义的方法,用于拦截目标方法的调用并进行自定义的操作。

Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
  • proxy:代理对象,即生成的代理类的实例。

  • method:被调用的目标方法。

  • args:方法的参数。

invoke()方法中,可以在目标方法执行前后进行拦截操作,例如记录日志、权限验证、性能监控等。在方法执行前可以进行一些预处理,如参数校验、权限检查等;在方法执行后可以进行一些后处理,如结果处理、日志记录等。

invoke()方法中,需要通过反射调用目标方法,并将结果返回。可以使用method.invoke(target, args)来调用目标方法,其中target是目标对象,args是方法的参数。

在拦截操作完成后,invoke()方法返回目标方法的执行结果。可以对结果进行一些处理,或者直接返回原始结果。

总结来说,invoke()方法是在拦截器中实现的,用于拦截目标方法的调用,并在拦截器中进行自定义的操作。通过反射调用目标方法,并返回执行结果。

进程通信是指不同进程之间进行数据交换和共享的方式。常见的进程通信方式包括:

  1. 管道(Pipe):管道是一种半双工的通信方式,它可以在父进程和子进程之间传递数据。管道可以是匿名的,也可以是有名字的。

  2. 命名管道(Named Pipe):命名管道是一种有名字的管道,可以用于不相关的进程之间进行通信。

  3. 信号(Signal):信号是一种异步通信方式,用于通知进程发生了某个事件。进程可以捕捉信号并执行相应的处理程序。

  4. 消息队列(Message Queue):消息队列是一种存储在内核中的消息缓冲区,进程可以通过消息队列进行数据交换。

  5. 共享内存(Shared Memory):共享内存是一种高效的进程通信方式,多个进程可以访问同一块物理内存,从而实现数据共享。

  6. 信号量(Semaphore):信号量是一种同步机制,用于控制多个进程对共享资源的访问。

  7. 套接字(Socket):套接字是一种网络通信方式,可以在不同主机上的进程之间进行通信。

  8. 文件(File):进程可以通过读写文件来进行通信,其中一个进程将数据写入文件,另一个进程读取文件中的数据。

选择适当的进程通信方式取决于具体的需求和场景。不同的通信方式具有不同的特点和适用范围。

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

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

相关文章

Nginx特性应用及载装

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好&#xff0c;中国大陆使用nginx的网站有&#xff1a;网易、腾讯、阿里等。 …

文字识别的

对于 PDF 提取文字&#xff0c;Tesseract OCR 是一个常用的工具。你可以使用 Tesseract OCR 的 Java API 来实现。以下是一个使用 Tesseract OCR 提取 PDF 文档文字的简单示例代码&#xff1a; import net.sourceforge.tess4j.Tesseract; import net.sourceforge.tess4j.Tesse…

MyBatis-Plus —— 初窥门径

前言 在前面的文章中荔枝梳理了MyBatis及相关的操作&#xff0c;作为MyBatis的增强工具&#xff0c;MyBatis-Plus无需再在xml中写sql语句&#xff0c;在这篇文章中荔枝将梳理MyBatis-Plus的基础知识并基于SpringBoot梳理MyBatis-Plus给出的两个接口&#xff1a;BaseMapper和ISe…

对象模型和this指针(个人学习笔记黑马学习)

1、成员变量和成员函数 #include <iostream> using namespace std; #include <string>//成员变量和成员函数分开存储class Person {int m_A;//非静态成员变量 属于类的对象上的static int m_B;//静态成员变量 不属于类的对象上void func() {} //非静态成员函数 不…

LeetCode 1921. Eliminate Maximum Number of Monsters【贪心,计数排序】1527

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

供应链 | 顶会CIKM论文精读:面向大规模三维装箱问题的数据驱动树形搜索算法

论文解读&#xff1a;丁建辉&#xff0c;李明哲&#xff0c;赵艳蓉&#xff0c;孙楚天 编者按 本次解读的文章发表于CCF-B类会议30th ACM International Conference on Information and Knowledge Management。摘要总结如下&#xff1a; 3维装箱问题&#xff08;3D-BPP&#…

Redis的缓存穿透,缓存击穿,缓存雪崩

1. 缓存穿透 什么是缓存穿透&#xff1f; 缓存穿透说简单点就是大量请求的 key 是不合理的&#xff0c;根本不存在于缓存中&#xff0c;也不存在于数据库中 。这就导致这些请求直接到了数据库上&#xff0c;根本没有经过缓存这一层&#xff0c;对数据库造成了巨大的压力&…

雪花算法生成id分析与实践

目录 1 什么是雪花算法&#xff1f; 结构 优点 缺点 2 在java中使用 使用注意&#xff1a; 测试代码 效果 1 什么是雪花算法&#xff1f; witter的雪花算法&#xff08;Snowflake Algorithm&#xff09;。雪花ID是一种分布式唯一ID生成算法&#xff0c;旨在解决分布式…

业绩走低,毛利率下滑,海外市场能否成为极米科技救命稻草?

撰稿|行星 来源|贝多财经 8月30日&#xff0c;成都极米科技股份有限公司&#xff08;SH:688696&#xff0c;下称“极米科技”&#xff09;发布2023年半年度业绩报告。财报显示&#xff0c;极米科技2023年上半年的业绩出现了大幅下滑&#xff0c;其中收入同比减少两成&#xf…

代码随想录二刷day06

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣242. 有效的字母异位词二、力扣349. 两个数组的交集三、力扣202. 快乐数四、力扣1两数之和 前言 一、力扣242. 有效的字母异位词 class Solution {pub…

数学建模-点评笔记 9月3日

1.摘要&#xff1a;关键方法和结论&#xff08;精炼的语言&#xff09;要说明&#xff0c;方法的合理性和意义也可以说明。 评委先通过摘要筛选&#xff08;第一轮&#xff09; 2.时间序列找异常值除了3西格玛还有针对时间序列更合适寻找的方法 3.模型的优缺点要写的详细一点…

世微AP9234 升压型DC/DC LED恒流驱动

描述 AP9234是一款由基准电压源、振荡电路、误差放大电路、相位补偿电路、电流限制电路等构成的CMOS升压型DC/DC LED驱动。由于内置了低导通电阻的增强型N沟道功率MOSFET&#xff0c;因此适用于需要高效率、高输出电流的应用电路。另外&#xff0c;可通过在VSENSE端子连接电流…

754. 到达终点数字

754. 到达终点数字 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 754. 到达终点数字 https://leetcode.cn/problems/reach-a-number/description/ 完成情况&#xff1a; 解题思路&#xff1a; 牛顿莱布尼茨梯…

softmax的cuda编程详细解读——算子融合

softmax介绍 在上一篇博客我们介绍了softmax的内容以及相关的编程实现,总结一下softmax的特点如下:(没有特殊说明的情况下,考虑的仍然只是1D向量 x x x) 1:获得向量的全局最大值M 2:针对向量 x ^ = { exp ⁡ ( x i −

vue3 组件通信方式

文章目录 组件通信方式props自定义事件全局事件总线v-modeluseAttrsref与$parentprovide与injectpiniaslot 组件通信方式 props ​ 实现父子组件通信,在vue3中可以通过defineProps获取父组件传递的数据。且在组件内部不需要引入defineProps方法可以直接使用&#xff01; 父组…

SWAT-MODFLOW地表水与地下水耦合

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…

ConsoleApplication815项目(直接加载+VEH Hook Load)

上线图 ConsoleApplication815.cpp #include <iostream> #include<Windows.h> #include "detours.h" #include "detver.h" #pragma comment(lib,"detours.lib")#pragma warning(disable:4996)LPVOID Beacon_address; SIZE_T Beacon…

leetcode分类刷题:哈希表(Hash Table)(三、循环存在问题)

1、当需要快速判断某元素是否出现在序列中时&#xff0c;就要用到哈希表了。 2、本文针对的总结题型为给定的序列或需要构造的序列中是否存在循环&#xff0c;与 160. 相交链表、 141. 环形链表、142. 环形链表 II的题型一样。 202. 快乐数 这道题还考察如何对正整数求解各个位…

用js的moment插件判断日期的格式是否符合‘YYYY-MM-DD‘

可以使用moment插件中的isValid()方法来判断一个日期字符串是否符合YYYY-MM-DD格式。 示例代码&#xff1a; const dateStr 2021-08-01; const dateFormat YYYY-MM-DD;const isValidDate moment(dateStr, dateFormat, true).isValid();console.log(isValidDate); // true这…

敏捷开发、V模型开发、瀑布模型

在软件开发领域&#xff0c;敏捷开发和V模型开发是两种主要的开发方法。它们之间的差异主要体现在开发过程的结构和组织方式上。在以下讨论中&#xff0c;我们将深入探讨这两种方法的特点和差异。 敏捷开发 敏捷开发是一种迭代和增量的软件开发方法&#xff0c;它强调灵活性和…