Module java.rmi
Package java.rmi.server

Class UnicastRemoteObject

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

public class UnicastRemoteObject extends RemoteServer
用于使用JRMP导出远程对象并获取与远程对象通信的存根。存根是在运行时使用动态代理对象生成的。

已弃用: 静态存根。 已弃用对静态生成的存根的支持。这包括此类中需要使用静态存根的API,以及用于加载静态存根的运行时支持。推荐使用动态生成存根的方式,使用下面列出的非已弃用的导出对象的方式之一。

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

  1. 继承UnicastRemoteObject并调用UnicastRemoteObject()构造函数。
  2. 继承UnicastRemoteObject并调用UnicastRemoteObject(port)构造函数。
  3. 继承UnicastRemoteObject并调用UnicastRemoteObject(port, csf, ssf)构造函数。
  4. 调用exportObject(Remote)方法。已弃用。
  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模块开放的包中。
  • 代理的调用处理程序是使用RemoteObjectInvocationHandler实例构造的RemoteRef
  • 如果无法创建代理,则会抛出一个StubNotFoundException

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

实现注意事项:
根据用于导出对象的构造函数或静态方法的不同,可能会使用RMISocketFactory来创建套接字。默认情况下,由RMISocketFactory创建的服务器套接字在所有网络接口上监听。请参阅RMISocketFactory类和Java RMI规范中的RMI套接字工厂部分。
自版本:
1.1
参见:
  • Constructor Details

    • 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
  • Method Details

    • clone

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

      @Deprecated public static RemoteStub exportObject(Remote obj) throws RemoteException
      Deprecated.
      This method is deprecated because it supports only static stubs. Use exportObject(Remote, port) or exportObject(Remote, port, csf, ssf) instead.
      导出远程对象以使其能够接收使用匿名端口的传入调用。此方法将始终返回一个静态生成的存根。

      对象是使用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
      导出远程对象以使其能够接收传入调用,使用特定提供的端口和过滤器

      对象是使用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
      导出远程对象以使其能够接收传入调用,使用给定套接字工厂和过滤器指定的传输。

      任一套接字工厂都可以为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