RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。
RPC的实现中一个重要的功能就是动态代理。整个过程如下:
首先,对于用户方而言:
假设,我们有一个接口如下:
只有方法名称,也不知道接口在远端的实现类的名称。
然后,我们的ProxyHandler如下:
具体使用时这样:
这样,就可以实现RPC的代理了。运行结果:
那具体实现RPC可如下。
cglib是通过字节码,生成了目标类的子类实现动态代理的。因此,对于final的方法无法使用cglib进行动态代理。
首先引入Cglib包:
首先,目标对象不发生任何变化,并且该类也不需要实现任何接口了:
代理类写法如下:
通过代码我们也可以看出,代理类是作为目标类的子类出现的,在调用目标类方法时,实际是调用父类。
使用如下:
使用过程比较简单:
1. 生成一个代理对象
2. 告诉代理对象,它的实现在哪里
3. 告诉代理对象,它的父类是谁
4. 生成代理类的对象
5. 调用代理对象的方法
这样,对生成的代理对象进行调用时,会调用到它的回调对象,然后回调对象中根据操作可能调用目标对象(父类)的方法。
得到结果:
before speak
hello Jack
after speak
OK