动态代理设计模式|学习笔记

简介: 快速学习 动态代理设计模式

开发者学堂课程【Java 高级编程动态代理设计模式】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/20/detail/394


动态代理设计模式


内容简介:

1.代理设计

2.代理方法

3.范例

 

 

 

1.代理设计

通过静态代理设计模式的缺陷可以发现,最好的做法是为所有功能一致的业务操作接口提供有统一的代理处理操作,而这可以通过动态代理机制来实现,但是在动态代理机制里面需要考虑到如下几点问题:

1)不管是动态代理类还是静态代理类都一定要接收真实业务实现子类对象

动态代理机制,相当于有一个代理类,代理的是一堆业务接口。不管是静态代理还是动态代理,在整个程序的处理过程之中,一定要保证它能够接收所有的真实业务处理子类

这里通过 proxy 来接收:

图片7.png


2)由于动态代理类不再与某一个具体的接口进行捆绑,所以应该可以动态获取类的接口信息。

动态代理最终返回给客户端的是一个接口代理对象,但是这个代理类不会与任何接口产生联系。

由于在每一个对象里面都可以通过反射获取接口,那么在整个操作过程之中,可以直接使用obj.getClass().getlnterfaces()方法来获取所有可能需要用到的接口的操作对象。

客户端要想能够正常执行处理,就必须准备出一个接口代理对象,而接口代理对象是通过反射接口获得的,

如下图:

图片8.png

当取得接口对象之后都会有一个专门的系统类,系统类会根据接口对象和传过来的操作信息,做出自己的接口代理对象。系统将根据类加载器创建一个所谓的系统对象,当客户端通过代理对象进行操作的时候,本质上操作的就是接口。

 

在进行代理对象的创建和操作的过程之中,最重要的是 invocation Handler。Invocation Handler 实现的操作,就是在开发之中所做的代理方法控制。以上就是整个的代理设计模式的实现的结构,整个流程图如下:图片9.png

在进行动态代理实现的操作之中,首先需要关注的就是一个 Invocation Handler 接口,这个接口规定了代理方法的执行。

 

这个代码由于要跨越到多个接口存在,所以方法名称由程序自己定义。

 

 

把 invocation handler 打开,接口如下:

图片10.png

public interface InvocationHandler {

/**

* 代理方法调用,代理主题类里面执行的方法最终都是此方法

* @param proxy要代理的对象

* @param method要执行的接口方法名称

* @param args 传递的参数

* @return 某一个方法的返回值

* @throws Throwable 方法调用时出现的错误继续向上抛出

*/

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;

}

 

2.代理方法

在进行动态代理设计的时候对于动态对象的创建是由JVM底层完成的,此时主要依靠的是 java.lang.reflect.Proxy 程序类,而这个程序类之中只提供有一个核心方法:

代理对象:

public static Object newProxyInstance(ClassLoader loader,Class<?>[]interfaces,InvocationHandler h)

-ClassLoader loader:获取当前真实主题类的 ClassLoader;

- Class<?>[]interfaces:代理是围绕接口进行的,所以一定要获取真实主题类的接口信息;

- InvocationHandler h:代理处理的方法。

图片11.png

在整个代理操作中,第一个操作 Invocation handler,第二个核心类 proxy。

在主类进行操作处理的时候,一定要接收的是业务的真实实现类,proxy 根 据真实业务类对象创建代理对象。

主类进行操作用的是 proxy 返回的代理对象进行操作的,而这个代理对象最重要的特征是它的结构复合业务接口结构。

代理的对象不是直接去调用,它在调用的代理操作会找到 Invocation handler,方法 invoke()。

比如当调用对象的时候,业务接口中有个方法 fun():void,那么代理对象发出的指令也是对象.fun()。但是当调用时,会找到 invoke,而后 invoke 去调用业务接口方法,业务接口方法就是业务的实现子类,以上就是整体的操作流程。

 

3.范例

范例:实现动态代理机制

图片12.png

图片13.png

代码执行结果如下:

******【执行方法】

public abstract void cn.mldn.demo.IMessage.send()

【消息代理】进行消息发送通道的连接

【发送消息】www.mldn.cn

【消息代理】关闭消息通道。

 

如果你认真观察系统中提供的Proxy.newProxyInstance()方法,就会发现该方法会使用大量的底层机制来进行代理对象的动态创建,所有的代理类是复合所有相关功能需求的操作功能类,它不再代表具体的接口,这样在处理的时候就必须依赖于类加载器与接口进行代理对象的伪造。

相关文章
|
设计模式 存储 Java
【设计模式——学习笔记】23种设计模式——备忘录模式Memento(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——备忘录模式Memento(原理讲解+应用场景介绍+案例介绍+Java代码实现)
89 0
|
设计模式 存储 Java
【设计模式——学习笔记】23种设计模式——迭代器模式Iterator(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——迭代器模式Iterator(原理讲解+应用场景介绍+案例介绍+Java代码实现)
56 0
|
2月前
|
设计模式 网络协议 Java
06.动态代理设计模式
本文详细介绍了动态代理设计模式,包括其必要性、概念、实现方式及案例分析。动态代理允许在运行时动态创建代理对象,增强代码复用性和灵活性,减少类膨胀。文章通过对比静态代理,深入解析了动态代理的实现机制,如基于接口和类的动态代理,以及其在Retrofit中的应用。同时,讨论了动态代理的优势和潜在问题,如性能开销和调试难度。最后,提供了丰富的学习资源链接,帮助读者进一步理解和掌握动态代理。
25 1
|
2月前
|
设计模式 Java Kotlin
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
33 2
|
2月前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
47 0
|
2月前
|
设计模式 Java Kotlin
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
32 0
|
4月前
|
设计模式 Java API
设计模式-------------静态/动态代理模式(结构型设计模式)
本文详细介绍了代理模式,包括其定义、应用场景、UML类图、代码实现和实际例子,阐述了静态代理和动态代理的区别以及它们的优缺点,展示了如何通过代理模式来控制对目标对象的访问并增强其功能。
|
5月前
|
设计模式 Java
Head First设计模式学习笔记
Head First设计模式学习笔记
|
7月前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
100 1
|
7月前
|
设计模式 安全 Java
静态代理还是动态代理?来聊聊Java中的代理设计模式
代理模式(Proxy Design Pattern)是一种结构型设计模式,为一个对象提供一个代理对象,然后使用代理对象控制对原对象的引用。即通过代理对象访问目标对象。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。
54 0
静态代理还是动态代理?来聊聊Java中的代理设计模式

热门文章

最新文章