【发布时间】:2011-12-31 16:59:47
【问题描述】:
据我所知,给定一个扩展Remote 的IFoo 接口和一个实现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)中,尚不清楚。
基于FooImpl 实例的Proxy 构造在哪里实现?我已经看到客户端代码(Naming.bind())中的 RMI 注册表管理通过调用 LocateRegistry.getRegister() 封装了(注册表)Proxy 类创建。所以在请求中:
Naming.bind( "foo", new FooImpl() )
是注册表Proxy 类调用处理程序处理扩展Remote 以将它们转换为引用/Proxy 类的参数吗?
在这种情况下,假设 (1) 中的存根 Proxy 类本身就是 Remote 类,这是否意味着存储在注册表中的对象是对引用的引用(即 Proxy打电话给另一个Proxy 打电话给真正的班级)?
谢谢。
【问题讨论】: