转载请注明出处:反射机制+动态代理实现模拟RMI远程方法调用
1 涉及主要知识点
1、RMI(Remote Method Invocation):远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外 一台计算机上的对象来获取远程数据。RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI的基本框架如下图所示:
2、代理模式,可具体参考文章:JDK动态代理深入分析 本案例中的远程代理的基本模型如下:
2 项目详解
项目需求:客户端LocalClient请求调用远程服务器端RemoteServer的业务类RemoteService的方法getService,并将方法结果返回。其中将客户端请求方法的信息封装成Call对象,再将方法的返回结果设置进call对象中,即B/S之间传递call对象,因此Call对象需要实现Serializable接口。底层Socket通信由Connector负责。由于涉及到远程代理,这里采用JDK动态代理模式。采用工厂模式,根据给定的服务器的host和port,以及类名,由工厂RemoteServiceProxyFactory获取代理类。代理模式中,代理类和目标类需要实现共同的接口Service,客户端针对Service接口编程。
以上过程基本描述了所涉及到了类名,系统类结构图如下:
(1)创建代理类和目标类需要实现共同的接口Service。
package com.markliu.remote.service;
/**
* Service接口。代理类和被代理类抖需要实现该接口
*/
public interface Service {
public String getService(String name, int number);
}
(2)服务器端创建RemoteService类,实现了Service 接口。
package com.markliu.remote.serviceimpl;
import com.markliu.remote.service.Service;
/**
* 服务器端目标业务类,被代理对象
*/
public class RemoteService implements Service {
@Override
public String getService(String name, int number) {
return name + ":" + number;
}
}
(3)创建封装客户端请求和返回结果信息的Call类。
为了便于按照面向对象的方式来处理客户端与服务器端的通信,可以把它们发送的信息用 Call 类来表示。一个 Call 对象表示客户端发起的一个远程调用,它包括调用的类名或接口名、方法名、方法参数类型、方法参数值和方法执行结果。
package com.markliu.local.bean;
import java.io.Serializable;
/**
* 请求的javabean
*/
public class Call implements Serializable{
private static final long serialVersionUID = 5386052199960133937L;
private String className; // 调用的类名或接口名
private String methodName; // 调用的方法名
private Class<?>[] paramTypes; // 方法参数类型
private Object[] params; // 调用方法时传入的参数值
/**