java.rmi.Nameing 和 java.rmi.registry.LocateRegistry 有什么区别

2022-09-03 06:55:06

当学习RMI时,有时(头先爪哇)家伙使用

Naming.rebind(name, object) 

但网络上的其他人(神谕)使用

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

我知道hf java有点旧,但我没有看到命名类被弃用。

那么,有什么区别呢?


答案 1

[有什么]与java.rmi.Namingjava.rmi.registry.LocateRegistry

不同之处在于,将字段解析为 URL,而 将 分析为“要与远程引用关联的名称”。该调用假定注册表位于默认端口的本地主机上,而 允许您指定要使用的注册表。nameNaming.rebind()Registry.rebind()LocateRegistry.getRegistry()Naming.rebind()

在Java 1.6下,将解析为URL并使用注册表的主机/端口进行调用。这要求.Naming.rebind()nameNaming.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);
}

答案 2

没有区别,如果你看源代码,那么你会看到这个:

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,不是我自己的impl。

类似的问题在这里


推荐