在程序设计中,我们经常会遇到多进程交互,多进程协同工作,分布式任务处理等这样的场景,在这些场景中我们都会涉及到远程通信与远程调用,下面我们用java提供的rmi远程调用来构建一个远程服务
一、RMI用法
java语言提供了一种很简便的远程调用,就是RMI,下面我们来看一下RMI的用法
首先,我们定义一个接口
/**
* 这个接口必须继承自java.rmi.Remote
*/
public interface IRmiService extends Remote {
/**
* 接口方法需要抛出RemoteException异常
*/
public String getName() throws RemoteException;
}
其次,我们定义接口的实现
/**
* 接口的实现类必须继承自java.rmi.server.UnicastRemoteObject
*/
public class RmiServiceImpl extends UnicastRemoteObject implements IRmiService {
private static final long serialVersionUID = 1L;
public RmiServiceImpl() throws RemoteException {
super();
}
@Override
public String getName(){
System.out.println("service ");
return getClass().getName();
}
}
最后,我们分别写服务端服务监听和客户端请求的代码
服务端:
//监听端口
int port = 20010;
LocateRegistry.createRegistry(port);
//定义接口服务的具体实例对象
IRmiService rmiService = new RmiServiceImpl();
//服务名称,绑定服务
String serviceName = "rmi://127.0.0.1:" + port + "/IRmiService";
Naming.bind(serviceName, rmiService);
System.out.println("server listening ...");
客户端:
int port = 20010;
//服务名称
String serviceName = "rmi://127.0.0.1:" + port + "/IRmiService";
IRmiService rmiService = (IRmiService)Naming.lookup(serviceName);
String name = rmiService.getName();
System.out.println("name is " + name);
先运行服务端一直在运行中,并且输出为:
server listening ...
再运行客户端,客户端输出为:
name is com.java.RmiServiceImpl
同时服务端也有输出:
server listening ...
service
二、反射调用
java提供了反射技术,利用反射技术,我们能够在预先不知道具体对象以及具体函数的时候,先写上一些通用的调用代码,然后在运行时动态决定具体调用某个对象的某个函数
首先,我们定义一个通用调用类
/**
* 通用的调用池子,只要注册类的实现,就可以动态控制调用了
*/
public class CommonInvoke {
/**
* 存放接口(类)与具体实现的对应关系
*/
private Map<Class<?>, Object> map = new HashMap<Class<?>, Object>();
/**
* 注册实现
*/
public<