据我可以看到,给定一个IFoo
界面延伸Remote
和FooImpl
类实施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
调用真正的课堂)?
谢谢。
感谢。它是否意味着在(1)中,'Naming.bind(“foo”,new FooImpl());'应该优先于'Naming.bind(“foo”,stub);'? – lledr 2012-01-01 10:15:50
@ysomane恰恰相反,它意味着它没有任何区别。您可能有其他原因希望第二个选择,例如保留对远程对象的引用,以便您可以将其导出。 – EJP 2012-01-08 00:50:35