代理相关概念
在某些情况下,我们不希望或是不能直接访问对象 A,而是通过访问一个中介对象 B,由 B 去访问 A 达成目的,这种方式我们就称为代理。
这里对象 A 所属类我们称为委托类,也称为被代理类,对象 B 所属类称为代理类。
代理优点有:
- 隐藏委托类的实现。
- 解耦,不改变委托类代码情况下做一些额外处理,比如添加初始判断及其他公共操作。
根据程序运行前代理类是否已经存在,可以将代理分为静态代理和动态代理:
- 代理类在程序运行前已经存在的代理方式称为静态代理。
- 代理类在程序运行前不存在、运行时由程序动态生成的代理方式称为动态代理。
Java 提供了动态代理的实现方式,可以在运行时刻动态生成代理类。这种代理方式的一大好处是可以方便对代理类的函数做统一或特殊处理,如记录所有函数执行时间、所有函数执行前添加验证判断、对某个特殊函数进行特殊操作,而不用像静态代理方式那样需要修改每个函数。
动态代理实例
实现动态代理包括三步:
- 新建委托类;
- 实现InvocationHandler接口,这是负责连接代理类和委托类的中间类必须实现的接口;
其中只有一个函数需要去实现:
public Object invoke(Object proxy, Method method, Object[] args)
- 通过Proxy类新建代理类对象。
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
使用场景
- J2EE Web 开发中 Spring 的 AOP(面向切面编程) 特性
作用:目标函数之间解耦。
- 基于 REST 的 Android 端网络请求框架 Retrofit
作用:简化网络请求操作。