RPC-动态代理
使用 JDK 动态代理的核心是InvocationHandler
接口和Proxy
类。
- InvocationHandler 接口
实现该接口来处理自定义逻辑,当动态代理对象调用一个方法时,这个方法的调用就会被转发到实现了 InvocationHandler 接口类的invoke
方法来调用。1
2
3
4
5public interface InvocationHandler {
/**
* 当你使用代理对象调用方法的时候实际会调用到这个方法
*/
public Object invoke(Object proxy, Method method, Object[] args) - Proxy 类
使用最多的是 Proxy 类的newProxyInstance()
方法,用来生成代理对象。1
2
3public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h) {}
生成代理对象方法的三个参数分别是:loader
:类加载器,用于加载代理对象;interfaces
:被代理类实现的接口;h
:实现了 InvocationHandler 接口的对象。
总的来说,JDK 动态代理的使用步骤:
- 定义一个接口及实现类;
- 自定义 InvocationHandler 并重写 invoke 方法,在 invoke 方法中通常会调用原生方法并自定义一些处理逻辑;
- 通过 Proxy.newProxyInstance() 方法创建代理对象。
在 RPC 中,是如何使用 JDK 动态代理的呢?
定义 JDK 动态代理类,实现核心的 InvocationHandler 接口,重写 invoke 方法:
1 | public class ClientProxy implements InvocationHandler { |
获取代理对象的工厂类,这里我将工厂类的getProxy()
方法定义在动态代理类当中。
1 | // 创建代理对象 |
其他的,在原生实现类和对应的接口:
1 | public class UserServiceImpl implements UserService { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 KiCheng's Blog!