- java.lang.Object
-
- java.rmi.server.RemoteObject
-
- java.rmi.server.RemoteServer
-
- java.rmi.server.UnicastRemoteObject
-
- All Implemented Interfaces:
-
Serializable
,Remote
- 已知直接子类:
-
ActivationGroup
public class UnicastRemoteObject extends RemoteServer
用于使用JRMP导出远程对象并获取与远程对象通信的存根。 存根是使用动态代理对象在运行时生成的,或者它们在生成时静态生成,通常使用rmic
工具。已弃用:静态存根。 支持静态生成的存根已被弃用。 这包括此类中需要使用静态存根的API,以及加载静态存根的运行时支持。 动态生成存根是首选的,使用以下列出的不推荐的导出对象之一。 不要运行
rmic
生成静态存根类。 这是不必要的,也是不推荐的。导出远程对象有八种方式:
- 子类
UnicastRemoteObject
并调用UnicastRemoteObject()
构造函数。 - 分类
UnicastRemoteObject
并调用UnicastRemoteObject(port)
构造函数。 - 分类
UnicastRemoteObject
并调用UnicastRemoteObject(port, csf, ssf)
构造函数。 - 调用
exportObject(Remote)
方法。 已过时。 - 调用
exportObject(Remote, port)
方法。 - 调用
exportObject(Remote, port, csf, ssf)
方法。 - 调用
exportObject(Remote, port, filter)
方法。 - 调用
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
-
-
Field Summary
-
Fields inherited from class java.rmi.server.RemoteObject
ref
-
-
构造方法摘要
构造方法 Modifier Constructor 描述 protected
UnicastRemoteObject()
使用匿名端口创建并导出新的UnicastRemoteObject对象。protected
UnicastRemoteObject(int port)
使用特定提供的端口创建并导出新的UnicastRemoteObject对象。protected
UnicastRemoteObject(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf)
使用特定提供的端口和套接字工厂创建并导出新的UnicastRemoteObject对象。
-
方法摘要
所有方法 静态方法 接口方法 具体的方法 弃用的方法 Modifier and Type 方法 描述 Object
clone()
返回与原始对象不同的远程对象的克隆。static RemoteStub
exportObject(Remote obj)
已过时。此方法已被弃用,因为它仅支持静态存根。 改用exportObject(Remote, port)
或exportObject(Remote, port, csf, ssf)
。static Remote
exportObject(Remote obj, int port)
使用特定提供的端口导出远程对象以使其可用于接收来电。static Remote
exportObject(Remote obj, int port, ObjectInputFilter filter)
使用特定提供的端口和filter导出远程对象以使其可用于接收来电。static Remote
exportObject(Remote obj, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf)
使用给定套接字工厂指定的传输导出远程对象以使其可用于接收来电。static Remote
exportObject(Remote obj, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf, ObjectInputFilter filter)
使用指定的套接字工厂指定的传输和filter ,导出远程对象以使其可用于接收来电。static boolean
unexportObject(Remote obj, boolean force)
从RMI运行时中删除远程对象obj。-
Methods inherited from class java.lang.Object
finalize, getClass, notify, notifyAll, wait, wait, wait
-
Methods inherited from class java.rmi.server.RemoteObject
equals, getRef, hashCode, toString, toStub
-
Methods inherited from class java.rmi.server.RemoteServer
getClientHost, getLog, setLog
-
-
-
-
构造方法详细信息
-
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
- 另请参见:
-
Cloneable
-
exportObject
@Deprecated public static RemoteStub exportObject(Remote obj) throws RemoteException
- 参数
-
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,即使有待处理或正在进行的调用,也会force
对象; 如果为false,则只有在没有待处理或正在进行的调用时,才会取消对象的输出 - 结果
- 如果操作成功,则为true,否则为false
- 异常
-
NoSuchObjectException
- 如果远程对象当前未导出 - 从以下版本开始:
- 1.2
-
-