java.rmi.Naming和java.rmi.registry.LocateRegistry有什么区别?

17

学习RMI时有时(《Head First Java》)会使用的术语

Naming.rebind(name, object) 

但是其他网站上的人(如Oracle)使用

Registry registry = LocateRegistry.getRegistry();
registry.rebind(name, object);

我知道HF Java有点老了,但我没有看到Naming类被弃用(deprecated)。

那么,它们有什么区别呢?

2个回答

12
【java.rmi.Naming】和【java.rmi.registry.LocateRegistry】之间有什么区别?
区别在于,对于 Naming.rebind() 方法,name 字段被解析为 URL,而对于 Registry.rebind() 方法,则是 "用于关联远程引用的名称"。LocateRegistry.getRegistry() 调用假定注册表位于默认端口上的本地主机上,而 Naming.rebind() 允许您指定要使用的注册表。
在 Java 1.6 中,Naming.rebind() 将 name 解析为 URL,并使用注册表的主机/端口调用 Naming.getRegistry()。这将调用 LocateRegistry.getRegistry(host, port)。
public static void rebind(String name, Remote obj) throws RemoteException, MalformedURLException 
    ParsedNamingURL parsed = parseURL(name);
    Registry registry = getRegistry(parsed);
    if (obj == null)
        throw new NullPointerException("cannot bind to null");
    registry.rebind(parsed.name, obj);
}
...

private static Registry getRegistry(ParsedNamingURL parsed) throws RemoteException {
    return LocateRegistry.getRegistry(parsed.host, parsed.port);
}

7

如果您查看源代码,将会看到以下内容:

public static void rebind(String name, Remote obj)
throws RemoteException, java.net.MalformedURLException {
    ParsedNamingURL parsed = parseURL(name);
    Registry registry = getRegistry(parsed);

    if (obj == null)
        throw new NullPointerException("cannot bind to null");

    registry.rebind(parsed.name, obj);
}

免责声明:代码取自JDK而非我的实现。
类似问题在这里提出

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接