动态代理的原理和保护代理的概念 | 学习笔记

简介: 快速学习动态代理的原理和保护代理的概念

开发者学堂课程【Scala 核心编程 - 进阶动态代理的原理和保护代理的概念学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9147


动态代理的原理和保护代理的概念


内容介绍:

一、动态代理概念

二、保护代理


一、动态代理概念

1. 动态代理概念的引入

在学习 Java 反射的时候已经了解了动态代理和静态代理,动态代理是开发中经常用到的一种代理模式。

现有一个对象 RealSubject,要实现对这个对象操作的控制,不希望别人直接来调用,而是针对不同的人,给予不同的调用权限

image.png

2、动态代理示意图

image.png

现有这样的场景,右侧为被代理的类(被代理的对象),传统的调用方法一般是:

val obj =new 类() obj.xxx,但是在某些情况不允许这样调用,比如一个被代理的类person具有setName、getXXX、setscore等几个方法,现有两种应用场景,第一种希望A类用户能够调用实例化person类,但是只能够调用其中的 setName 方法,其他方法不可调用,而B类用户可以去调用person中的setscore和getXXX方法,不能调用其他方法。

即A和B两种用户,对person的方法调用权限是不一样的,面对这种需求可能有些同学提出将其设置为私有类型,但是设置成私有类型后,B类用户也无法进行调用,因为私有不针对用户种类,无法实现权限的控制,因此不能通过私有的方式来满足需求。

  • 解决方法

image.png

收回调用的箭头,在中间添加一个代理,通过动态代理创建一个代理对象,用来替代被调用的对象,使用反射机制实现对调用权限的控制,这就是动态代理的核心问题。

创建代理对象帮助我们完成调用,不再是直接调用,而是通过代理模式针对A用户返回一种代理对象,针对B用户返回另一种代理对象,然后即可满足对调用权限的控制,针对A类用户返回的代理对象只能调 setName 方法,针对B用户则只能调用 setscore 和 getXXX 方法。将来同学们遇到这种类似的需求时,就可以去应用代理去解决问题。

3、动态代理的实现

image.png

User为刚才所讲的A类用户或者B类用户,不是直接实例化RealSubject,而是添加一个subject的接口,让代理和真正被调的对象实现这个接口,代理和 InvocationHandler共同构成动态代理来帮我们返回代理对象,用反射的 invoke 来判断到底应该调用哪些方法,即Proxy和Invocation Handler 共同构成代理。

总结:

动态代理是指运行时动态的创建代理类(对象),也就是RealSubject的代理,因为真正调用的其实是RealSubject,并将方法调用转发到指定的地方。

  • Proxy和 InvocationHandler 组合充当代理的角色;
  • RealSubject是一个实际对象,它实现接口Subject;
  • 在使用时,我们不希望直接访问RealSubject的对象,比如:我们对这个对象的访问是有控制的比如有些方法可以调用,有些方法不可以调用;
  • 我们使用动态代理,在程序中通过动态代理创建RealSubject,并完成调用;
  • 动态代理可以根据需要,创建多种组合
  • Proxy也会实现Subject接口的方法,因此,使用Proxy+invocation可以完成对RealSubject的动态调用。
  • 但是通过Proxy调用RealSubject方法是否成功,是由InvocationHandler来控制的。(这里其实就是保护代理)

理解:

我们在写反射的时候,会实现一个方法,里面就有invoke这个方法,所谓动态代理可以这样理解,创建一个代理对象管代披调用的真实对象使用反射实现控制。


二、保护代理

动态代理已经包含了保护代理的概念,有些面试官可能会问到动态代理实现的机制,这个时候就可以把刚才的图进行简单的描述,有时也有可能会问到保护代理的概念,所以我们对保护代理进行简单的讲解。

保护代理:

通过前面的分析:大家可以看出动态代理其实就体现出保护优理,即代理时,对被代理的对象(类)的哪些方法可以调用,哪些方法不能调用在

InvocationHandler 可以控制。因此动态代理就体现(实现)了保护代理的效果。

相关文章
|
算法 分布式数据库
Paxos算法:分布式一致性的基石
【4月更文挑战第21天】Paxos算法是分布式一致性基础,由Leslie Lamport提出,包含准备和提交阶段,保证安全性和活性。通过提案编号、接受者和学习者实现,广泛应用于分布式数据库、锁和配置管理。其简单、高效、容错性强,影响了后续如Raft等算法,是理解分布式系统一致性关键。
|
数据挖掘 数据格式
跟着Cell学作图 | 6.时间序列分析(Mfuzz包)
这篇2020年发表在cell上关于新冠的组学文章里面有大量的生信内容。今天带大家复现其中的一个Supplemental Figure:时间序列分析图。
1134 0
跟着Cell学作图 | 6.时间序列分析(Mfuzz包)
|
Linux
【Linux 系统编程】wait函数详解
【Linux 系统编程】wait函数详解
429 0
|
前端开发 Java 关系型数据库
SpringBoot基于官网构建及项目快速启动
SpringBoot基于官网构建及项目快速启动
518 0
|
7月前
|
人工智能 自然语言处理 算法
生成式人工智能认证(GAI认证)与标准化进程协同发展及就业市场赋能研究
本文探讨生成式人工智能认证(GAI认证)在人工智能标准化进程中的重要性,分析其对就业市场的积极影响及未来发展趋势。GAI认证不仅是个人AI能力的权威认可,还推动行业标准化与技术创新。文章指出,随着技术融合加速和应用场景拓展,GAI认证标准需不断完善,以应对技术更新、数据安全等挑战,为AI健康发展贡献力量。
|
存储 数据采集 安全
CDAM数据资产管理的策略制定与落地
在数字化时代,数据成为企业的核心资产,直接影响决策效率与市场竞争力。本文探讨数据资产管理策略的制定与实施,涵盖目标设定、组织架构搭建、政策流程制定、工具技术应用、数据战略规划、人才培养、风险管理及持续优化等方面,旨在为企业提供全方位的实践指导。
|
运维 Kubernetes Linux
Kubernetes详解(二十一)——ReplicaSet控制器实战应用
Kubernetes详解(二十一)——ReplicaSet控制器实战应用
231 2
|
机器学习/深度学习 并行计算 Linux
环境安装(二):不同平台皆可安装Paddle
这篇文章介绍了如何在不同操作系统平台上安装PaddlePaddle,包括Windows和Linux,以及如何使用Paddle Lite在AMD64和ARM架构上部署模型,并提供了官方安装命令和进一步学习资源。
887 0
|
数据安全/隐私保护 Docker 容器
docker 部署nexus
要在Docker上部署Nexus,可以按照以下步骤进行操作: 1. 确保已经安装并配置好Docker。可以在官方网站(https://www.docker.com/)上找到适合你操作系统的安装程序,并按照说明进行安装。 2. 搜索并下载Nexus的Docker镜像。在Docker Hub上搜索"Nexus",找到Sonatype官方提供的Nexus Repository Manager的镜像。 3. 使用以下命令从Docker Hub上下载Nexus镜像: ``` docker pull sonatype/nexus3 ``` 4. 运行Nexus容器。使用以下命令创建并运行一个名为"
1323 0
|
12月前
|
PHP 数据安全/隐私保护
virtual judge怎么改中文
若遗忘密码,可通过服务器的root权限重设,或直接联系您的服务器提供商获取支持。
217 0