当前位置: 首页 > news >正文

JDK动态代理的原理解析、代码实现

代理就像是:买家(客户端)——销售(代理对象)——工厂(目标)

        买家不用直接去工厂买,而是直接通过销售就可以购买到,假设工厂生产的是杯子,那么工厂只需要提供杯子,而销售在不改变杯子的生产过程的情况下对杯子进行包装设计,广告宣传。提高其销量。

      代理模式中,代理对象充当了被代理对象的中间人,客户端通过代理对象来访问被代理对象,而不是直接访问被代理对象。主要目的是在不改变原始对象的情况下,提供额外的功能或控制访问。增强了代码的安全性、灵活性。

1、动态代理是什么?

      静态代理在编译时就已经确定代理类和被代理类的关系,代理类是手动编写的。在静态代理中,需要为每个被代理的类编写一个代理类。它需要手动编写代理类,当被代理的类较多时,会导致代码冗余。所以在这种情况下我们需要使用动态代理。

        动态代理在运行时动态生成代理类和代理对象,不需要手动编写代理类。在动态代理中,代理类是在运行时通过反射机制动态生成的。动态代理的优点是可以减少代码冗余,缺点是相对于静态代理,它的实现稍微复杂一些。

2、JDK动态代理的实现方式

        下面代码实例是通过调用经纪人代理对象调用明星的跳舞、rap方法。明星只负责工作,而在经纪人方法当中添加收钱的功能。

定义接口:我首先定义了一个Star接口,该接口有dance和rap两个接口:

public interface Star {/*** 跳舞*/public void dance();/*** 说唱*/public void rap();
}

创建Star接口实现类:在这个类当中将两个方法实现:

public class OnePeople implements Star{@Overridepublic void dance() {System.out.println("我跳舞了");}@Overridepublic void rap() {System.out.println("我唱了rap");}
}

创建InvocationHandler实现类

//当调用代理对象的方法时,实际上是调用了invoke()方法。在invoke()方法中,可以根据需要执行一些前置或后置操作,然后将方法调用转发给实际的对象。
public class MyInvocationHandler implements InvocationHandler {//被代理对象Object object;public MyInvocationHandler (Object o){object = o;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("我已经收好钱了,我的boss可以开始工作了");//通过反射调用被代理对象的方法。Object invoke = method.invoke(object, args);System.out.println("我们已经工作完毕,拍拍屁股离开");return invoke;}
}

创建代理对象:

public class Demo {public static void main(String[] args) {OnePeople onePeople = new OnePeople();MyInvocationHandler myInvocationHandler = new MyInvocationHandler(onePeople);//newProxyInstance()接受三个参数:类加载器、要实现的接口列表和一个InvocationHandler对象// 返回的是实现指定接口的代理类的实例。这个实例可以被强制转换为接口类型,以便在代码中使用。Star star = (Star) Proxy.newProxyInstance(onePeople.getClass().getClassLoader(),onePeople.getClass().getInterfaces(), myInvocationHandler);//调用跳舞方法star.dance();//调用rap方法star.rap();}
}

运行结果:

注意:JDK动态代理只能代理接口,不能代理具体的类。如果要代理具体的类,可以考虑使用其他的代理机制(CGLIB机制)。

3、动态代理的优点

  1. 灵活性:动态代理可以在运行时创建代理对象,而不需要在编译时就确定代理对象的类型。这使得动态代理更加灵活,可以根据需要动态地创建不同类型的代理对象。

  2. 可扩展性:动态代理可以通过实现InvocationHandler接口来自定义代理对象的行为。通过在InvocationHandler中编写自定义的逻辑,可以在代理对象的方法调用前后进行额外的操作,如日志记录、性能监控、事务管理等。这种可扩展性使得动态代理在很多场景下非常有用。

  3. 低耦合性:动态代理可以将代理对象的创建和代理逻辑的实现分离开来,从而实现低耦合性。代理对象的创建可以由代理工厂或者依赖注入容器等负责,而代理逻辑的实现可以由InvocationHandler来完成。这种低耦合性使得代码更加清晰、易于维护和扩展。

  4. 动态性:动态代理可以在运行时动态地修改代理对象的行为。这意味着可以根据需要动态地添加、修改或删除代理对象的方法,从而实现更加灵活的代理逻辑。

相关文章:

JDK动态代理的原理解析、代码实现

代理就像是:买家(客户端)——销售(代理对象)——工厂(目标) 买家不用直接去工厂买,而是直接通过销售就可以购买到,假设工厂生产的是杯子,那么工厂只需要提供杯子,而销售在不改变杯子的生产过程的情况下对杯子进行包装设…...

理解和使用Ansible模块,简化自动化任务

Ansible是一款强大的自动化工具,用于管理和配置IT基础设施。在Ansible的世界中,模块(Module)是至关重要的组成部分。本文将深入探讨Ansible模块,了解它们如何简化自动化任务的执行过程。 Ansible模块是Ansible的核心组…...

Docker 快速安装 MinIO

概述 MinIO 是一款基于Go语言的高性能对象存储服务,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。 拉取docker镜像 docker pull minio/minio创建宿主机数据目录(共享数据卷) 此…...

【源码分析】Nacos如何使用AP协议完成服务端之间的数据同步?

AP节点的同步使用的是异步任务消息队列的方式来实现的。 取出任务之后将会放入到一个List集合中。 然后会发现任务的执行是由条件的。 首先是当前集群的节点数量等于1000,那么此时会直接开始同步,当然这个条件在小项目中不会成立,所以还有…...

黑客删除服务器数据后,间谍软件制造商 LetMeSpy 关闭

总部位于波兰的间谍软件 LetMeSpy 已不再运行,并表示将在 6 月份的一次数据泄露事件中关闭其服务器,其中包括从数千名受害者手机中窃取的大量数据。 LetMeSpy 在其网站上以英语和波兰语发布的通知中确认该间谍软件服务已“永久关闭”,并将于 …...

ebay儿童书包产品CPC认证

儿童书包是一种能够盛放书本或者文具的包。现在的书包五花八门,以普通的布料或者是帆布等制成,有背带,包内一般分栏。一般分三种,背在身后的,挎在肩上的,轮式(可以拖行)的。 一、美国…...

Debezium系列之:增量快照初始化历史数据实际应用案例

Debezium系列之:增量快照初始化历史数据实际应用案例 一、需求背景二、查看数据库表数据三、使用增量快照采集历史数据四、初始化历史数据一、需求背景 采集数据库数据发送到Kafka Topic,供下游实时开发消费,在采集最新数据的同时,希望把历史数据也发送到Kafka Topic同时采…...

Transformer1.0-预热

一.Encoder encoder:译为编码器,负责将输入序列压缩成指定长度的向量,这个向量就可以堪称是这个序列的语义。然后可进行编码或特征提取等操作 在transformer中encoder由6个相同的层组成,每个层包含 Multi-Head Self-AttentionPosition-Wise …...

【探索Linux】—— 强大的命令行工具 P.2(Linux下基本指令)

前言 前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C的一些知识,也相信大家都掌握的不错,今天博主将会新开一个Linux专题,带领大家继续学习有关Linux的内容。今天第一篇文章博主首先带领大家了解一下…...

供应链售后服务自动化,利用软件机器人将数据整合提升效率

随着供应链管理的不断发展,售后服务的重要性也日益凸显。良好的售后服务不仅可以提高客户满意度,还能增强品牌形象和忠诚度。然而,传统的供应链售后服务往往存在繁琐的操作、低效率和易出错的问题。为了解决这一挑战,越来越多的企…...

VIM浅谈

VIM 1. 文件1.1 管理多个文件 仅以此篇纪念VIM作者Bram Moolenaar。 1. 文件 刚刚使用VIM,很多小伙伴疑惑的就是如何退出VIM,一顿乱按结果修改了文件,q又退不出去,还需要保存。这是因为文件是保存在磁盘里的,使用Vim…...

《深度探索c++对象模型》第六章笔记

非原创,在学习 6 执行期语意学(Runtime Semantics) 有这样一个简单的案例: if (yy xx.getValue()) {// ... } 其中,xx和yy的定义为: X xx; Y yy; class Y定义为: class Y { public:Y();~Y();bool operator(con…...

wolfSSL5.6.3 虚拟机ubuntu下编译运行记录(踩坑填坑)

网上相关教程很多(包括wolfSSL提供的手册上也是如此大而化之的描述),大多类似如下步骤: ./configure //如果有特殊的要求的话可以在后面接上对应的语句,比如安装目录、打开或关闭哪些功能等等 make make install 然后结束,大体…...

JAVA SE -- 第十六天

(全部来自“韩顺平教育”) IO流 一、文件 是保存数据的地方 2、文件流 文件在程序中是以流的形式来操作 流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从数据…...

基于EIoT能源物联网的工厂智能照明系统应用改造-安科瑞黄安南

【摘要】:随着物联网技术的发展,许多场所针对照明合理应用物联网照明系统,照明作为工厂的重要能耗之一,工厂的照明智能化控制,如何优化控制、提高能源的利用率,达到节约能源的目的。将互联网的技术应用到工…...

docker-compose启动tomcat服务

docker-compose启动tomcat服务 编写docker-compose.yaml文件 version: "3.1" services:tomcat: restart: always image: tomcat:8.0.52 container_name: tomcat ports:- 8082:8080 environment:TZ: Asia/Shanghai volumes:- /usr/local/webapps/:/usr/local/t…...

10.多线程

文章目录 10.1简述线程、程序、进程的基本概念。以及他们之间关系是什么?10.2线程有哪些基本状态? 10.1简述线程、程序、进程的基本概念。以及他们之间关系是什么? 线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程…...

【有关数据库的编码格式和导出备份】

问题1:前端页面可以正常插入数据到数据库mysql中,但是却显示不了数据库中的数据内容? 分析:通过尝试,当数据插入的全部都是英文时,可以正常显示数据,但是出现中文时,则连带着全部数…...

直播招聘小程序解决方案

项目开发愿景 介绍工作拿佣金,Boss直播现真身。做为直播招聘的新平台,让求职和招聘变得更简单!企业发布招聘视频,展现公司环境与实力,开通会员可以直播招聘、在线面试功能;求职者刷视频可以刷到工作…...

HadoopWEB页面上传文件报错Couldn‘t upload the file course_info.txt

HadoopWEB页面上传文件报错Couldn’t upload the file course_info.txt 右键F2检查发现:文件上传PUT操作的IP地址是节点IP别名识别不到导致 解决方法:在WEB页面访问浏览器所在机器上面配置hosts映射地址(注意:配置的是浏览器访问的地址不是hadoop节点所在…...

面试热题(倒数第k个结点)

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表…...

EVE-NG MPLS 静态 LSP

1 拓扑 2 配置步骤 2.1 配置接口IP 和路由 LER1 interface GigabitEthernet1/0ip address 10.1.1.1 255.255.255.0quitinterface GigabitEthernet2/0ip address 11.1.1.1 255.255.255.0quitip route-static 21.1.1.0 24 10.1.1.2VPC1 ip 11.1.1.100/24 11.1.1.1 配置完成后…...

华秋亮相2023世界汽车制造技术暨智能装备博览会,推动汽车产业快速发展

洞悉全球汽车产业格局,前瞻业界未来趋势。2023年7月27日-30日,时隔三年,重聚武汉国际博览中心,2023世界汽车制造技术暨智能装备博览会盛大开幕。深耕汽车行业多年的世界汽车制造技术暨智能装备博览会,掀起行业热点新高…...

华为OD机试真题【开心消消乐】

1、题目描述 【开心消消乐】 给定一个N行M列的二维矩阵,矩阵中每个位置的数字取值为0或1。矩阵示例如: 1100 0001 0011 1111 现需要将矩阵中所有的1进行反转为0,规则如下: 1) 当点击一个1时,该1便被反转为…...

txt去重

目录 txt去重 让我解释一下代码的逻辑: for a in [a.strip(\n) for a in list(f_read)]: txt去重 f_read open(r./1.txt, r, encodingutf-8) f_write open(r./2.txt, w,encodingutf-8) data set() for a in [a.strip(\n) for a in list(f_read)]:if a not in …...

系统集成测试与验收

功能性测试:测试系统应提供的每一个功能和安全性限制,检查系统是否已 正常实现所有功能。 连通性测试:测试网络上任意站点间是否能够相互传输数据,测试各个终端 能否登录中心服务器,并访问数据库,对数据库…...

ElementPlus文件上传 ,在上传前钩子中判断文件是否为图片

在ElementPlus中,可以使用beforeUpload属性来指定上传文件之前的钩子函数,在该函数中可以对文件进行判断并进行相关操作。 首先,在data中定义一个isImage变量来记录文件是否为图片,初始值为false。然后,在钩子函数中判…...

涂鸦智能获Matter Non-VID Scoped PAA资质 助力开发者拥抱Matter生态

今年5月,全球化IoT开发者平台涂鸦智能(NYSE: TUYA,HKEX: 2391)正式生成Tuya Matter PAA密钥根,并于7月,成功通过了连接标准联盟和第三方MA机构审查而上线。自此,涂鸦正式成为全球同时提供支持Ma…...

nsqd的架构及源码分析

文章目录 一 nsq的整体代码结构 二 回顾nsq的整体架构图 三 nsqd进程的作用 四 nsqd启动流程的源码分析 五 本篇博客总结 在博客 nsq整体架构及各个部件作用详解_YZF_Kevin的博客-CSDN博客 中我们讲了nsq的整体框架,各个部件的大致作用。如果没看过的&…...

​LeetCode解法汇总344. 反转字符串

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数…...