java - RMI 和引用/代理类

标签 java rmi

据我所知,给定一个扩展 RemoteIFoo 接口(interface)和一个实现 IFooFooImpl 类,以下两个代码片段(几乎)是等价的:(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 注册表管理封装了一个(注册表)Proxy 类创建并调用了 LocateRegistry。 getRegister()。所以在请求中:

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

是注册表 Proxy 类调用处理程序处理扩展 Remote 的参数以将它们转换为引用/Proxy 类吗?

在那种情况下,假定 (1) 中的 stub Proxy 类本身是一个 Remote 类,这是否意味着存储在注册表中的对象是一个对引用的引用(即 Proxy 调用另一个 Proxy 调用真实类)?

谢谢。

最佳答案

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

关于java - RMI 和引用/代理类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8689363/

相关文章:

Java 链式/嵌套方法调用

authentication - 一个进程如何与同一主机上的另一个进程安全地进行身份验证和通信

java - 如何在运行时为嵌套属性创建 CriteriaBuilder 表达式?

java - 带 https 的 Spring web 和 tomcat

java - 如何使用 .next() 迭代对象映射?

java - 如何修复 RMI 中的 javax.naming.CommunicationException?

java - 在 Java 中,服务器如何更改其 RMI 客户端的线程 ID?

java - Rmi 客户端不使用代码库

java - GAE 中的 Hibernate Ehcache 抛出 java.lang.NoClassDefFoundError : java. rmi.server.UID 是受限类

java - Nodejs 和 Java 之间的连接。当 java 客户端连接到 nodejs 服务器时,它显示错误,