Module  java.rmi
软件包  java.rmi.server

Class UnicastRemoteObject

  • All Implemented Interfaces:
    SerializableRemote
    已知直接子类:
    ActivationGroup


    public class UnicastRemoteObject
    extends RemoteServer
    用于使用JRMP导出远程对象并获取与远程对象通信的存根。 存根是使用动态代理对象在运行时生成的,或者它们在生成时静态生成,通常使用rmic工具。

    已弃用:静态存根。 支持静态生成的存根已被弃用。 这包括此类中需要使用静态存根的API,以及加载静态存根的运行时支持。 动态生成存根是首选的,使用以下列出的不推荐的导出对象之一。 不要运行rmic生成静态存根类。 这是不必要的,也是不推荐的。

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

    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

    静态生成的存根通常使用rmic工具从远程对象的类中rmic 加载一个静态存根,并且如下所述构造该存根类的一个实例。

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

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

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

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

    Implementation Note:
    根据使用哪种构造函数或静态方法导出对象,可以使用RMISocketFactory创建套接字。 默认情况下, RMISocketFactory创建的服务器套接字在所有网络接口上侦听。 RMISocketFactory类和RMI Socket Factories中的Java RMI Specification
    从以下版本开始:
    1.1
    另请参见:
    Serialized Form
    • 构造方法详细信息

      • 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
    • 方法详细信息

      • 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,即使有待处理或正在进行的调用,也会force对象; 如果为false,则只有在没有待处理或正在进行的调用时,才会取消对象的输出
        结果
        如果操作成功,则为true,否则为false
        异常
        NoSuchObjectException - 如果远程对象当前未导出
        从以下版本开始:
        1.2