据我所知,给定一个扩展 Remote
的 IFoo
接口(interface)和一个实现 IFoo
的 FooImpl
类,以下两个代码片段(几乎)是等价的:(1)
IFoo stub = ( IFoo )UnicastRemoteObject.exportObject( new FooImpl() );
Naming.bind( "foo", stub );
并且,如果 FooImpl
是一个扩展 UnicastRemoteObject
的类:(2)
Naming.bind( "foo", new FooImpl() );
事实上,FooImpl
实例导出是在隐式UnicastRemoteObject
构造函数调用中完成的。
但是在(1)中,UnicastRemoteObject.exportObject()
返回的对象是一个Proxy
(动态)类,因此记录在RMI注册表中的对象是显然是一个引用。而在(2)中,它并不清楚。
基于 FooImpl
实例的 Proxy
构造在哪里实现?我已经看到客户端代码 (Naming.bind()
) 中的 RMI 注册表管理封装了一个(注册表)Proxy
类创建并调用了 LocateRegistry。 getRegister()
。所以在请求中:
Naming.bind( "foo", new FooImpl() )
是注册表 Proxy
类调用处理程序处理扩展 Remote
的参数以将它们转换为引用/Proxy
类吗?
在那种情况下,假定 (1) 中的 stub Proxy
类本身是一个 Remote
类,这是否意味着存储在注册表中的对象是一个对引用的引用(即 Proxy
调用另一个 Proxy
调用真实类)?
谢谢。
最佳答案
当 FooImpl 对象在 bind() 调用中编码到注册表时,它会自动被其 stub 替换。当用作远程方法的参数或结果时,任何导出的远程对象都会发生这种情况。
关于java - RMI 和引用/代理类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8689363/