模块  java.rmi
软件包  java.rmi.server

Class UnicastRemoteObject

  • 实现的所有接口
    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工具从远程对象的类中生成。 加载静态存根,并按如下所述构造该存根类的实例。

    • “根类”确定如下:如果远程对象的类直接实现扩展Remote的接口,则远程对象的类是根类; 否则,根类是远程对象类的派生程度最高的类,它直接实现扩展Remote的接口。
    • 要加载的存根类的名称是通过将根类的二进制名称与后缀_Stub连接来确定的。
    • 存根类使用根类的类加载器按名称加载。 存根类必须是公共的,它必须扩展RemoteStub ,它必须驻留在至少导出到java.rmi模块的包中,并且它必须具有一个公共构造函数,其具有一个类型为RemoteRef参数。
    • 最后,使用RemoteRef构造存根类的实例。
    • 如果找不到相应的存根类,或者无法加载存根类,或者创建存根实例时出现问题,则抛出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类和5078034186060中的RMI Socket Factories部分
    从以下版本开始:
    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