RMI 接口和类概述
负责指定 RMI 系统远程行为的接口和类在 java.rmi 包层次结构中定义。下图显示了其中几个接口和类之间的关系:

在 java.rmi.Remote
接口
在 RMI 中,远程 接口是一个接口,它声明一组可以从远程 Java 虚拟机调用的方法。远程接口必须满足以下要求:
- 远程接口必须至少直接或间接扩展接口
java.rmi.Remote
。 - 远程接口或其超接口中的每个方法声明必须满足远程方法声明的要求,如下所示:
- 除了任何特定于应用程序的异常(注意,特定于应用程序的异常不必扩展)之外,远程方法声明还必须在其 throws 子句中 包含异常
java.rmi.RemoteException
(或其超类之一,例如java.io.IOException
或 )。java.lang.Exception
java.rmi.RemoteException
- 在远程方法声明中,声明为参数或返回值的远程对象(直接在参数列表中声明或嵌入在参数中的非远程对象中)必须声明为远程接口,而不是其实现类界面。
- 除了任何特定于应用程序的异常(注意,特定于应用程序的异常不必扩展)之外,远程方法声明还必须在其 throws 子句中 包含异常
该接口java.rmi.Remote
是一个没有定义任何方法的标记接口:
public interface Remote {}
远程接口必须至少扩展接口java.rmi.Remote
(或扩展 的 另一个远程接口java.rmi.Remote
)。但是,在以下情况下,远程接口可以扩展非远程接口:
- 远程接口也可以扩展另一个非远程接口,只要扩展接口的所有方法(如果有)都满足远程方法声明的要求。
例如,以下接口BankAccount
定义了一个用于访问银行帐户的远程接口。它包含向帐户存款、获取帐户余额和从帐户中取款的远程方法:
public interface BankAccount extends java.rmi.Remote { public void deposit(float amount) throws java.rmi.RemoteException; public void withdraw(float amount) throws OverdrawnException, java.rmi.RemoteException; public float getBalance() throws java.rmi.RemoteException; }
下一个示例显示了一个有效的远程接口Beta
,它扩展了Alpha
具有远程方法的非远程接口和接口java.rmi.Remote
:
public interface Alpha { public final String okay = "constants are okay too"; public Object foo(Object obj) throws java.rmi.RemoteException; public void bar() throws java.io.IOException; public int baz() throws java.lang.Exception; } public interface Beta extends Alpha, java.rmi.Remote { public void ping() throws java.rmi.RemoteException; }
RemoteException
类
的 java.rmi.RemoteException
类是一个远程方法调用期间由RMI运行时抛出的异常的超类。为了确保使用 RMI 系统的应用程序的健壮性,在远程接口中声明的每个远程方法都必须在其 throws 子句中指定java.rmi.RemoteException
(或其超类之一,例如java.io.IOException
或 java.lang.Exception
)。
唯一的例外 java.rmi.RemoteException
,当一个远程方法调用由于某种原因失败时抛出。远程方法调用失败的一些原因包括:
- 通信失败(远程服务器不可达或拒绝连接;连接被服务器关闭等)
- 参数或返回值编组或解组期间失败
- 协议错误
该类RemoteException
是已检查异常(必须由远程方法的调用者处理并由编译器检查的异常),而不是RuntimeException
.
RemoteObject
类及其子类
RMI 服务器功能由java.rmi.server.RemoteObject
及其子类提供,java.rmi.server.RemoteServer
以及 java.rmi.server.UnicastRemoteObject
和 java.rmi.activation.Activatable
。
- 类
java.rmi.server.RemoteObject
提供了实现的java.lang.Object
,方法hashCode
,equals
和toString
。 - 创建远程对象和导出它们(使它们可用于远程客户端)所需的方法由类
UnicastRemoteObject
和Activatable
. 子类标识远程引用的语义,例如服务器是一个简单的远程对象还是一个可激活的远程对象(一个在调用时执行的对象)。 - 的
java.rmi.server.UnicastRemoteObject
类定义了一个单(单播)的远程对象,其引用仅在服务器进程是活有效。 - 该类
java.rmi.activation.Activatable
是一个抽象类,它定义了一个可激活的远程对象,该对象在其远程方法被调用时开始执行,并在必要时自行关闭。