【问题标题】:RMI and references / Proxy classesRMI 和引用/代理类
【发布时间】:2011-12-31 16:59:47
【问题描述】:

据我所知,给定一个扩展RemoteIFoo 接口和一个实现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 打电话给真正的班级)?

谢谢。

【问题讨论】:

    标签: java rmi


    【解决方案1】:

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

    【讨论】:

    • 谢谢。这是否意味着在(1)中,Naming.bind( "foo", new FooImpl() ); 应该优先于Naming.bind( "foo", stub );
    • @ysomane 相反,它暗示它没有任何区别。您可能有其他原因更喜欢第二个,例如保留对远程对象的引用,以便您可以取消导出它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多