- 所有已实现的接口:
-
Serializable
,Remote
已弃用: 静态存根。 已弃用对静态生成的存根的支持。这包括此类中需要使用静态存根的API,以及用于加载静态存根的运行时支持。推荐使用动态生成存根的方式,使用下面列出的非已弃用的导出对象的方式之一。
有八种导出远程对象的方式:
- 继承
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
。
静态生成的存根通常是从远程对象的类预生成的。加载静态存根并构造该存根类的实例如下所述。
- 确定“根类”的方法如下: 如果远程对象的类直接实现了扩展
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
- 参见:
-
Field Summary
Fields declared in class java.rmi.server.RemoteObject
ref
-
Constructor Summary
ModifierConstructorDescriptionprotected
创建并导出一个新的UnicastRemoteObject对象,使用匿名端口。protected
UnicastRemoteObject
(int port) 创建并导出一个新的UnicastRemoteObject对象,使用特定提供的端口。protected
UnicastRemoteObject
(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) 创建并导出一个新的UnicastRemoteObject对象,使用特定提供的端口和套接字工厂。 -
Method Summary
Modifier and TypeMethodDescriptionclone()
返回与原始对象不同的远程对象的克隆。static RemoteStub
exportObject
(Remote obj) 已弃用。此方法已弃用,因为它仅支持静态存根。static Remote
exportObject
(Remote obj, int port) 导出远程对象以使其可接收传入调用,使用特定提供的端口。static Remote
exportObject
(Remote obj, int port, ObjectInputFilter 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) 导出远程对象以使其可接收传入调用,使用由给定套接字工厂和过滤器指定的传输。static boolean
unexportObject
(Remote obj, boolean force) 从RMI运行时中删除远程对象obj。Methods declared in class java.rmi.server.RemoteServer
getClientHost, getLog, setLog
-
Constructor Details
-
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
-
-
Method Details
-
clone
返回与原始对象不同的远程对象的克隆。- 覆盖:
-
clone
在类中Object
- 返回:
- 新的远程对象
- 抛出:
-
CloneNotSupportedException
- 如果由于RemoteException而导致克隆失败 - 自版本:
- 1.1
- 参见:
-
exportObject
Deprecated.This method is deprecated because it supports only static stubs. UseexportObject(Remote, port)
orexportObject(Remote, port, csf, ssf)
instead.导出远程对象以使其能够接收使用匿名端口的传入调用。此方法将始终返回一个静态生成的存根。对象是使用
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 导出远程对象以使其能够接收传入调用,使用特定提供的端口和过滤器。对象是使用
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
从RMI运行时中删除远程对象obj。如果成功,则对象将不再接受传入的RMI调用。如果force参数为true,则即使有待处理的调用或远程对象仍在进行中,也会强制取消导出对象。如果force参数为false,则仅在对象没有待处理或正在进行中的调用时才会取消导出对象。- 参数:
-
obj
- 要取消导出的远程对象 -
force
- 如果为true,则即使有待处理或正在进行中的调用,也会取消导出对象;如果为false,则仅在没有待处理或正在进行中的调用时才会取消导出对象 - 返回:
- 如果操作成功,则为true,否则为false
- 抛出:
-
NoSuchObjectException
- 如果远程对象当前未导出 - 自版本:
- 1.2
-