- 所有已实现的接口:
Serializable
,Remote
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.
导出远程对象有八种方式:
- 继承
UnicastRemoteObject
并调用UnicastRemoteObject()
构造函数。 - 继承
UnicastRemoteObject
并调用UnicastRemoteObject(port)
构造函数。 - 继承
UnicastRemoteObject
并调用UnicastRemoteObject(port, csf, ssf)
构造函数。 - 调用
exportObject(Remote)
方法。 Deprecated. - 调用
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
。
静态生成的存根通常是从远程对象的类中预先生成的。加载一个静态存根并按如下所述构造该存根类的一个实例。
- “根类”的确定如下:如果远程对象的类直接实现了扩展
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
- 参见:
-
字段摘要
在类 java.rmi.server.RemoteObject 中声明的字段
ref
-
构造方法总结
构造方法修饰符构造方法描述protected
使用匿名端口创建并导出新的 UnicastRemoteObject 对象。protected
UnicastRemoteObject
(int port) 使用提供的特定端口创建并导出新的 UnicastRemoteObject 对象。protected
UnicastRemoteObject
(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) 使用特定提供的端口和套接字工厂创建并导出新的 UnicastRemoteObject 对象。 -
方法总结
修饰符和类型方法描述clone()
返回与原始对象不同的远程对象的克隆。static RemoteStub
exportObject
(Remote obj) 已弃用。此方法已弃用,因为它仅支持静态存根。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。在类 java.rmi.server.RemoteServer 中声明的方法
getClientHost, getLog, setLog
-
构造方法详细信息
-
UnicastRemoteObject
使用匿名端口创建并导出新的 UnicastRemoteObject 对象。该对象通过使用
RMISocketFactory
类创建的服务套接字导出。- 抛出:
RemoteException
- 如果导出对象失败- 自从:
- 1.1
-
UnicastRemoteObject
使用提供的特定端口创建并导出新的 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
返回与原始对象不同的远程对象的克隆。- 重写:
clone
在类Object
中- 返回:
- 新的远程对象
- 抛出:
CloneNotSupportedException
- 如果克隆由于 RemoteException 而失败。- 自从:
- 1.1
- 参见:
-
exportObject
已弃用。此方法已弃用,因为它仅支持静态存根。请改用exportObject(Remote, port)
或exportObject(Remote, port, csf, ssf)
。导出远程对象以使其可用于使用匿名端口接收传入呼叫。此方法将始终返回静态生成的存根。该对象通过使用
RMISocketFactory
类创建的服务套接字导出。- 参数:
obj
- 要导出的远程对象- 返回:
- 远程对象存根
- 抛出:
RemoteException
- 如果导出失败- 自从:
- 1.1
-
exportObject
使用提供的特定端口导出远程对象以使其可用于接收传入呼叫。该对象通过使用
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
从 RMI 运行时移除远程对象 obj。如果成功,该对象将不再接受传入的 RMI 调用。如果 force 参数为 true,则即使有对远程对象的挂起调用或远程对象仍在进行调用,也会强制取消导出对象。如果 force 参数为 false,则只有在没有挂起或正在进行的对象调用时才不导出对象。- 参数:
obj
- 要取消导出的远程对象force
- 如果为 true,即使有未决或正在进行的调用,也不会导出对象;如果为 false,只有在没有挂起或正在进行的调用时才取消导出对象- 返回:
- 如果操作成功则为 true,否则为 false
- 抛出:
NoSuchObjectException
- 如果当前未导出远程对象- 自从:
- 1.2
-