设为首页
收藏本站
切换到宽版
登录
立即注册
找回密码
搜索
搜索
本版
帖子
用户
快捷导航
论坛
BBS
VIP用户组
官网群
无名商城论坛
»
论坛
›
资源分享区
›
学习资源专区
›
【FX】Java基础知识|动态代理
返回列表
发帖
查看:
218
|
回复:
0
[其他技术]
【FX】Java基础知识|动态代理
[复制链接]
无名
无名
当前离线
积分
32464
1万
主题
1万
帖子
3万
积分
管理员
积分
32464
发消息
发表于 2022-5-8 16:07:45
|
显示全部楼层
|
阅读模式
一、代理模式
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
著名的代理模式例子为引用计数(英语:reference counting)指针对象。
当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少存储器用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象。而作用在代理者的运算会转送到原本对象。一旦所有的代理者都不存在时,复杂对象会被移除。
二、组成
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
三、优点
1、职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
2、保护对象
代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
3、高扩展性
四、模式结构
一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理
对象实现同一个接口,先访问代理类再访问真正要访问的对象。
代理模式分为静态代理、动态代理。
静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。
五、静态代理
创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法。之后再创建一个代理类,同时使其也实现这个接口。在代理类中持有一个被代理对象的引用,而后在代理类方法中调用该对象的方法。
使用静态代理很容易就完成了对一个类的代理操作。但是静态代理的缺点也暴露了出来:由于代理只能为一个类服务,如果需要代理的类很多,那么就需要编写大量的代理类,比较繁琐。
六、动态代理
1、动态代理流程图
2、动态代理代码实现
(1)代理类
利用反射机制在运行时创建代理类。
接口、被代理类不变,我们构建一个ProxyInvocationHandler类来实现InvocationHandler接口。
[太阳]这里代码放2楼
通过Proxy类的静态方法newProxyInstance返回一个接口的代理实例。针对不同的代理类,传入相应的代理程序控制器InvocationHandler。
(2)被代理类UserService
[太阳]这里代码放3,4楼
(3)执行动态代理
[太阳]这里代码放5楼
(4)控制台输出
七、动态代理底层实现
1、动态代理具体步骤
通过实现 InvocationHandler 接口创建自己的调用处理器;
通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。
2、源码分析
(1)newProxyInstance
既然生成代理对象是用的Proxy类的静态方newProxyInstance,那么我们就去它的源码里看一下它到底都做了些什么?
[太阳]这里代码放6楼
(2)getProxyClass0
利用getProxyClass0(loader, intfs)生成代理类Proxy的Class对象。
[太阳]这里代码放7楼
(3)ProxyClassFactory
ProxyClassFactory内部类创建、定义代理类,返回给定ClassLoader 和interfaces的代理类。
[太阳]这里代码放8和9楼
(4)generateProxyClass
一系列检查后,调用ProxyGenerator.generateProxyClass来生成字节码文件。
[太阳]这里代码放10楼
(5)generateClassFile
生成代理类字节码文件的generateClassFile方法:
[太阳]这里代码放11和12楼
字节码生成后,调用defineClass0来解析字节码,生成了Proxy的Class对象。在了解完代理类动态生成过程后,生产的代理类是怎样的,谁来执行这个代理类。
其中,在ProxyGenerator.generateProxyClass函数中 saveGeneratedFiles定义如下,其指代是否保存生成的代理类class文件,默认false不保存。
代理
,
对象
,
码放
,
实现
,
动态
相关帖子
•
【GD】iapp基础教程第三课(小白基础课)
•
【Max】结绳第十二课
•
【夜未央】Oracle day05 教程
•
【AIDE教程网】Linux命令实现《黑客帝国》代码雨_手机版
•
【DMT】cc攻击脚本
•
【凌晨网络】Html单页3D动态大鲨鱼
•
【FUT】代码分享:编辑框错误提示
•
【LUR】最新PHP粽子授权系统搭建教材
•
【解忧】最全的JAVA知识汇总(附讲解和思维导图)
回复
使用道具
举报
返回列表
发帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
快速回复
返回顶部
返回列表