模块 java.rmi

类 UnicastRemoteObject

所有已实现的接口:
Serializable , Remote

public class UnicastRemoteObject extends RemoteServer
远程对象通信的存根。存根是在运行时使用动态代理对象生成的。

Deprecated: Static Stubs. Support for statically generated stubs is deprecated. This includes the API in this class that requires the use of static stubs, as well as the runtime support for loading static stubs. Generating stubs dynamically is preferred, using one of the non-deprecated ways of exporting objects as listed below.

导出远程对象有八种方式:

  1. 继承 UnicastRemoteObject 并调用 UnicastRemoteObject() 构造函数。
  2. 继承 UnicastRemoteObject 并调用 UnicastRemoteObject(port) 构造函数。
  3. 继承 UnicastRemoteObject 并调用 UnicastRemoteObject(port, csf, ssf) 构造函数。
  4. 调用 exportObject(Remote) 方法。 Deprecated.
  5. 调用 exportObject(Remote, port) 方法。
  6. 调用 exportObject(Remote, port, csf, ssf) 方法。
  7. 调用 exportObject(Remote, port, filter) 方法。
  8. 调用 exportObject(Remote, port, csf, ssf, filter) 方法。

第四种技术 exportObject(Remote) 始终使用静态生成的存根,因此已弃用。

其他技术都使用以下方法:如果 java.rmi.server.ignoreStubClasses 属性为 true(不区分大小写)或者如果无法找到静态存根,则使用 Proxy 对象动态生成存根。否则,使用静态存根。

java.rmi.server.ignoreStubClasses 属性的默认值为 false

静态生成的存根通常是从远程对象的类中预先生成的。加载一个静态存根并按如下所述构造该存根类的一个实例。

  • “根类”的确定如下:如果远程对象的类直接实现了扩展Remote 的接口,那么远程对象的类就是根类;否则,根类是直接实现扩展 Remote 接口的远程对象类的最派生超类。
  • 要加载的存根类的名称是通过将根类的二进制名称与后缀 _Stub 连接起来确定的。
  • 存根类使用根类的类加载器按名称加载。存根类必须是公共的,它必须扩展 RemoteStub ,它必须驻留在至少导出到 java.rmi 模块的包中,并且它必须具有一个具有一个 RemoteRef 类型参数的公共构造函数。
  • 最后,使用 RemoteRef 构造存根类的实例。
  • 如果找不到合适的存根类,或者无法加载存根类,或者创建存根实例时出现问题,则会抛出 StubNotFoundException

存根是通过构造具有以下特征的 Proxy 实例动态生成的:

  • 代理的类是根据 Proxy 类的规范定义的,使用远程对象类的类加载器。
  • 代理实现远程对象类实现的所有远程接口。
  • 每个远程接口必须是公共的并且驻留在至少 java.rmi 模块的 输出 包中,或者它必须驻留在至少 java.rmi 模块的 open 包中。
  • 代理的调用处理程序是一个用 RemoteRef 构造的 RemoteObjectInvocationHandler 实例。
  • 如果无法创建代理,将抛出 StubNotFoundException

如 RMI 规范中所述,导出的远程对象从存根接收方法调用。每个调用的操作和参数都使用自定义 ObjectInputStream 解组。如果在导出对象时提供了 ObjectInputFilter 而不是 null,则当参数从流中解组时,它用于过滤参数。过滤器用于所有调用和所有参数,而不管被调用的方法或参数值如何。如果未提供过滤器或为导出对象提供 null,则使用 ObjectInputStream 默认过滤器(如果有)。默认过滤器配置为 ObjectInputFilter.Config.setSerialFilter 。如果过滤器拒绝任何参数,则 ObjectInputStream 抛出的 InvalidClassException 被报告为 UnmarshalException 的原因。

实现注意事项:
根据用于导出对象的构造函数或静态方法,RMISocketFactory 可用于创建套接字。默认情况下,由 RMISocketFactory 创建的服务套接字监听所有网络接口。请参阅 RMISocketFactory 类和 Java RMI 规范 中的 RMI 套接字工厂 部分。
自从:
1.1
参见:
  • 构造方法详细信息

    • UnicastRemoteObject

      protected UnicastRemoteObject() throws RemoteException
      使用匿名端口创建并导出新的 UnicastRemoteObject 对象。

      该对象通过使用 RMISocketFactory 类创建的服务套接字导出。

      抛出:
      RemoteException - 如果导出对象失败
      自从:
      1.1
    • UnicastRemoteObject

      protected UnicastRemoteObject(int port) throws RemoteException
      使用提供的特定端口创建并导出新的 UnicastRemoteObject 对象。

      该对象通过使用 RMISocketFactory 类创建的服务套接字导出。

      参数:
      port - 远程对象接收调用的端口号(如果 port 为零,则选择匿名端口)
      抛出:
      RemoteException - 如果导出对象失败
      自从:
      1.2
    • UnicastRemoteObject

      protected UnicastRemoteObject(int port, RMIClientSocketFactory  csf, RMIServerSocketFactory  ssf) throws RemoteException
      使用特定提供的端口和套接字工厂创建并导出新的 UnicastRemoteObject 对象。

      套接字工厂可能是 null ,在这种情况下,将使用 RMISocketFactory 的相应客户端或服务套接字创建方法。

      参数:
      port - 远程对象接收调用的端口号(如果 port 为零,则选择匿名端口)
      csf - 用于调用远程对象的客户端套接字工厂
      ssf - 用于接收远程调用的服务端套接字工厂
      抛出:
      RemoteException - 如果导出对象失败
      自从:
      1.2
  • 方法详情

    • clone

      public Object  clone() throws CloneNotSupportedException
      返回与原始对象不同的远程对象的克隆。
      重写:
      clone 在类 Object
      返回:
      新的远程对象
      抛出:
      CloneNotSupportedException - 如果克隆由于 RemoteException 而失败。
      自从:
      1.1
      参见:
    • exportObject

      @Deprecated public static RemoteStub  exportObject(Remote  obj) throws RemoteException
      已弃用。
      此方法已弃用,因为它仅支持静态存根。请改用 exportObject(Remote, port) exportObject(Remote, port, csf, ssf)
      导出远程对象以使其可用于使用匿名端口接收传入呼叫。此方法将始终返回静态生成的存根。

      该对象通过使用 RMISocketFactory 类创建的服务套接字导出。

      参数:
      obj - 要导出的远程对象
      返回:
      远程对象存根
      抛出:
      RemoteException - 如果导出失败
      自从:
      1.1
    • exportObject

      public static Remote  exportObject(Remote  obj, int port) throws RemoteException
      使用提供的特定端口导出远程对象以使其可用于接收传入呼叫。

      该对象通过使用 RMISocketFactory 类创建的服务套接字导出。

      参数:
      obj - 要导出的远程对象
      port - 导出对象的端口
      返回:
      远程对象存根
      抛出:
      RemoteException - 如果导出失败
      自从:
      1.2
    • exportObject

      public static Remote  exportObject(Remote  obj, int port, RMIClientSocketFactory  csf, RMIServerSocketFactory  ssf) throws RemoteException
      使用给定套接字工厂指定的传输导出远程对象,使其可用于接收传入呼叫。

      套接字工厂可能是 null ,在这种情况下,将使用 RMISocketFactory 的相应客户端或服务套接字创建方法。

      参数:
      obj - 要导出的远程对象
      port - 导出对象的端口
      csf - 用于调用远程对象的客户端套接字工厂
      ssf - 用于接收远程调用的服务端套接字工厂
      返回:
      远程对象存根
      抛出:
      RemoteException - 如果导出失败
      自从:
      1.2
    • exportObject

      public static Remote  exportObject(Remote  obj, int port, ObjectInputFilter  filter) throws RemoteException
      使用提供的特定端口和 filter 导出远程对象以使其可用于接收传入呼叫。

      该对象通过使用 RMISocketFactory 类创建的服务套接字导出。

      参数:
      obj - 要导出的远程对象
      port - 导出对象的端口
      filter - 反序列化调用参数时应用的 ObjectInputFilter;可能是null
      返回:
      远程对象存根
      抛出:
      RemoteException - 如果导出失败
      自从:
      9
    • exportObject

      public static Remote  exportObject(Remote  obj, int port, RMIClientSocketFactory  csf, RMIServerSocketFactory  ssf, ObjectInputFilter  filter) throws RemoteException
      使用给定套接字工厂和 filter 指定的传输,导出远程对象以使其可用于接收传入呼叫。

      套接字工厂可能是 null ,在这种情况下,将使用 RMISocketFactory 的相应客户端或服务套接字创建方法。

      参数:
      obj - 要导出的远程对象
      port - 导出对象的端口
      csf - 用于调用远程对象的客户端套接字工厂
      ssf - 用于接收远程调用的服务端套接字工厂
      filter - 反序列化调用参数时应用的 ObjectInputFilter;可能是null
      返回:
      远程对象存根
      抛出:
      RemoteException - 如果导出失败
      自从:
      9
    • unexportObject

      public static boolean unexportObject(Remote  obj, boolean force) throws NoSuchObjectException
      从 RMI 运行时移除远程对象 obj。如果成功,该对象将不再接受传入的 RMI 调用。如果 force 参数为 true,则即使有对远程对象的挂起调用或远程对象仍在进行调用,也会强制取消导出对象。如果 force 参数为 false,则只有在没有挂起或正在进行的对象调用时才不导出对象。
      参数:
      obj - 要取消导出的远程对象
      force - 如果为 true,即使有未决或正在进行的调用,也不会导出对象;如果为 false,只有在没有挂起或正在进行的调用时才取消导出对象
      返回:
      如果操作成功则为 true,否则为 false
      抛出:
      NoSuchObjectException - 如果当前未导出远程对象
      自从:
      1.2