发布网友 发布时间:2022-11-17 02:53
共1个回答
热心网友 时间:2024-11-23 12:08
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。
静态代理的代理类持有被代理者的引用,在方法调用时,代理对象调用了被代理对象去执行真正的实现。
2.1 简单示例
假如对于一个日志处理功能,可通过代理类代理实例日志处理类:
这样,在使用过程中,可以按如下方式使用:
2.2 AIDL
AIDL中也用到了代理模式,在Android Studio中新建一个AIDL文件,如下所示:
在点击make project后,会自动生成AIDL接口对应的代码,即对应的Stub和Proxy,可以看到AIDL的Proxy是通过静态代理实现,自动生成的代码如下所示:
在2.1的静态代理代码中,如果现在需要扩展一个新的接口,那就需要分别在接口层、实际处理类、代理类中分别改动,如下所示:
当代理一个新的接口时可见,新的代理类与其他代理类代码是高度相似的,因此可以采用动态代理的方式来完成类似的功能。
3.1 基础用法
与静态代理不同,动态代理类的class是在运行过程中动态生成的。
3.1.1 基础用法
首先定义接口层:
然后使用Proxy.newProxyInstance完成动态代理如下:
其中,InvocationHandler就是将静态代理中需要实现的部分抽离了出来,即动态生成的Proxy代理了InvocationHandler。
3.1.2 动态生成的class
动态生成的代理类的方法实际调用都到了InvocationHandler的invoke方法,动态生成的代理类class伪代码如下:
3.1.3 源码分析
下面分析Proxy.newProxyInstance的源码:
3.2 Retrofit动态代理
Retrofit是一个开源网络库,其源码中也使用到了动态代理模式。简单介绍如下:
3.2.1 基础用法
首先,新建网络请求对应的接口:
然后,使用Retrofit动态代理生成请求:
3.2.2 Retrofit动态代理实现
接下来分析Retrofit内部是如何使用动态代理模式的: