2011-12-31 67 views
1

据我可以看到,给定一个IFoo界面延伸RemoteFooImpl类实施IFoo,下面的两个代码片段是(几乎)相等的:(1)RMI和引用/代理类

IFoo stub = (IFoo)UnicastRemoteObject.exportObject(new FooImpl()); 
Naming.bind("foo", stub); 

并且,如果是FooImpl延伸UnicastRemoteObject的类:(2)

Naming.bind("foo", new FooImpl()); 

事实上,FooImpl实例出口在隐完成构造函数调用。

但在(1)中,由UnicastRemoteObject.exportObject()返回的对象是Proxy(动态)类,因此记录在RMI注册表中的对象显然是一个参考。而在(2)中,不清楚。

哪里 Proxy建设基于实现的一个实例 FooImpl

?我已经看到,在客户端代码(Naming.bind())RMI注册表管理封装了(注册表)Proxy类的创建与到LocateRegistry.getRegister()通话。因此,在请求:

Naming.bind("foo", new FooImpl()) 

难道是处理扩展Remote把它们转化为引用/ Proxy类的参数注册表Proxy类调​​用处理程序?

在此情况下,考虑到存根Proxy类(1)中本身是一个Remote类,将其意味着存储在注册表中的对象是对基准的基准(即Proxy调用另一个Proxy调用真正的课堂)?

谢谢。

回答

2

当FooImpl对象被编组到注册表中的绑定()调用它是由它的残余部分自动替换。作为一个远程方法的参数或结果使用时发生任何导出的远程对象。

+0

感谢。它是否意味着在(1)中,'Naming.bind(“foo”,new FooImpl());'应该优先于'Naming.bind(“foo”,stub);'? – lledr 2012-01-01 10:15:50

+0

@ysomane恰恰相反,它意味着它没有任何区别。您可能有其他原因希望第二个选择,例如保留对远程对象的引用,以便您可以将其导出。 – EJP 2012-01-08 00:50:35