据我所知,给定IFoo
接口扩展Remote
和FooImpl
类实现IFoo
,以下两个代码片段(几乎)等效: (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)中,尚不清楚。
基于Proxy
实例的FooImpl
构造在哪里实现了?我已经看到客户端代码(Naming.bind()
)中的RMI注册表管理通过调用Proxy
来封装(注册表)LocateRegistry.getRegister()
类创建。所以在请求中:
Naming.bind( "foo", new FooImpl() )
是注册表Proxy
类调用处理程序,它处理扩展Remote
的参数以将它们转换为引用/ Proxy
类吗?
在这种情况下,假设(1)中的存根Proxy
类本身是Remote
类,这意味着存储在注册表中的对象是对引用的引用(即一个Proxy
调用另一个Proxy
调用真正的类)?
感谢。
答案 0 :(得分:3)
当在绑定()调用中将FooImpl对象编组到注册表时,它会自动被其存根替换。当用作远程方法的参数或结果时,任何导出的远程对象都会发生这种情况。