Java RMI中命名和注册的区别

Java RMI中命名和注册的区别,java,registry,rmi,Java,Registry,Rmi,我用过 Naming.rebind("rmi://localhost:1099/RmiServer", c); 其中c是一个远程对象。及 XYZ robj=new XYZ(); ABC stub = (ABC) UnicastRemoteObject.exportObject(robj, 0); Registry registry = LocateRegistry.getRegistry(); registry.bind("RmiServer", stub); 其中存根是远程对象 如

我用过

Naming.rebind("rmi://localhost:1099/RmiServer", c);
其中c是一个远程对象。及

 XYZ robj=new XYZ();
 ABC stub = (ABC) UnicastRemoteObject.exportObject(robj, 0);
 Registry registry = LocateRegistry.getRegistry();
 registry.bind("RmiServer", stub);
其中存根是远程对象

如果rmiregistry已经在运行,那么第一种情况可以正常工作,但是后一种情况会引发
ServerException,即为ABC类引发ClassNotFoundException
。我哪里做错了

另外,
命名和注册表有何不同
,这里的命名是绑定到本地主机的,而后面的命名是动态获取相应的端口和地址,然后将对象绑定到它

如果RMI注册表正在运行,则第一种情况可以正常工作 已经,但后者正在抛出ServerException 为ABC类引发ClassNotFoundException。我要去哪里 错了吗

你把它背对背。如果使用单独的
rmiregistry
,如果远程接口和存根等不在rmiregistry的类路径上,您将获得
ClassNotFoundExceptions
。如果您通过
LocateRegistry.createRegistry()
启动正在进行的注册表,则无法执行此操作,否则在执行
bind()
之前导出将失败

在这里,命名和注册有什么不同 命名绑定到本地主机,而稍后将获取 动态地对应端口和地址,然后绑定对象 去吧

Naming
提供了一组静态方法,无需调用
LocateRegistry.getRegistry()
,即可与注册表交互。API非常相似,但名称字符串不同:它们基于URL

对于
命名
类,所有名称字符串都是RMI URL,例如。rmi://localhost:1099/. 这适用于所有方法:bind()、rebind()、unbind()、lookup()和list()

使用
注册表
界面,所有名称字符串都只是字符串,例如

因此,如果在代码的不同部分使用这两个类,则需要保持这一点以确保互操作性。例如,可以在注册表接口中使用命名样式的URL,它们仅被视为字符串,但是Naming.list()的结果类似于rmi://localhost:1099/rmi://localhost:1099/. 所以不要那样做

在这两种情况下,从list()返回的名称与您提供给其他方法之一的名称相同。

查看源代码(jdk 1.7.02),
Naming.rebind
调用
LocateRegistry.getRegistry(host,port)
,然后对结果调用
rebind(name,obj)
。因此,在代码级别上,似乎没有太大区别。你能发布一个简短的代码示例来说明你的问题吗?