Java反射---序列化和RMI中的应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/linfujian1999/article/details/77035039

最近在读分布式系统:概念与设计这本书的时候,发现java的reflect果真是一把利器,这里不想细讲反射的用法,主要是想总结下反射应用的设计理念。

先看序列化,分布式系统讲到:
java中无论是基本类型参数还是对象,都可被序列化,应用上很简单了,对象无非是可能涉及远程传输,它只有实现Serializable接口便可序列化,但底层是如何实现的呢?
比如A应用和B应用不在同一服务器上,A需要将C对象远程传输给B应用供它使用。那C对象必然实现了Serializable接口,再详细下,远程传输的不是C对象,而是C对象相关的一些信息:比如C对象类信息(方法,全局变量)以及实例变量值。这些信息需要编码然后在网络中传输给B应用,B应用接受到这些信息后,首先解码,好!反射来了,然后根据类信息使用反射new一个C的class对象,然后再new一个C的实例对象,将解码后的实例参数传给这个对象。OK,这样一个和A应用中一模一样的C对象就活生生的出现在B应用中了。不考虑底层,就好像C对象从A应用copy到了B应用。

再看RMI:
RMI–remote method invoke,远程方法调用,java的封装性故一般是调用远程对象中的方法。所以是对远程对象的操作。不同进程间的方法调用都是RMI,不管进程在同一还是不同的服务器上。

客户端和服务器之间的交互,客户端调用服务器上的远程对象中的方法。首先,客户端的代理(负责把调用信息编码发送给服务端)把编码成Method类的一个对象,把参数放入一个Object数组并编码该数组。服务器端的调度程序(负责解码请求中的方法和参数,找到本地引用并调用相关方法,返回结果)从请求消息中解码Method对象和Object数组中的参数。通常目标对象的远程引用已经被解码了,对象的本地对象引用已在远程引用模块(这里有一点需要说明下,服务端维护了一张表,内容是远程对象引用与本地对象引用的一一对应关系)中获得。然后调度程序调用Method对象的invoke方法,获得目标对象(本地对象引用)和参数数组,当已执行方法后,调度程序将结果或者任何出现的异常编码入应答消息。

通过上边两个概念性的栗子,可以看出反射的威力巨大,尤其在一些中间件的设计上,学好吧,骚年。

猜你喜欢

转载自blog.csdn.net/linfujian1999/article/details/77035039
今日推荐