RMI和引用/代理类

时间:2011-12-31 16:59:47

标签: java rmi

据我所知,给定IFoo接口扩展RemoteFooImpl类实现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调用真正的类)?

感谢。

1 个答案:

答案 0 :(得分:3)

当在绑定()调用中将FooImpl对象编组到注册表时,它会自动被其存根替换。当用作远程方法的参数或结果时,任何导出的远程对象都会发生这种情况。