据我所知,给定扩展了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调用另一个调用真实类)?谢谢。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 当FooImpl对象在bind()调用中编组到注册表时,它会自动由其存根替换。当任何导出的远程对象用作远程方法的参数或结果时,都会发生这种情况。 (adsbygoogle = window.adsbygoogle || []).push({});
07-26 04:46