【问题标题】:What exactly is the point of the codebase in Java RMI?Java RMI 中的代码库到底有什么意义?
【发布时间】:2012-05-05 19:35:56
【问题描述】:

我目前正在学习 RMI。

我不太了解代码库的概念。我阅读的每篇论文都表明,调用远程对象的客户端可以从代码库中加载方法定义。 现在的问题是:我不需要类路径中的描述/接口吗?如果我只在运行时知道它们,我如何调用远程对象上的方法?这甚至不会编译。

我是否完全错过了这里的重点?那么代码库到底有什么意义呢?提供代码库似乎需要很多额外的工作和要求

谢谢

【问题讨论】:

    标签: java rmi codebase


    【解决方案1】:

    好吧,假设您只向客户端提供接口,并且实现将位于给定的代码库中。然后客户端请求服务器发送一个给定的对象,客户端期望接收一个实现给定接口的对象,但是实际的实现对于客户端来说是未知的,当它反序列化发送的对象时它必须去代码base 并为实际传递的对象下载相应的实现类。

    这将使客户端变得非常瘦,并且您将非常轻松地更新代码库中的类,而无需求助于更新每个客户端。

    编辑

    假设您有一个具有以下界面的 RMI 服务器

    public interface MiddleEarth {
         public List<Creature> getAllCreatures();
    }
    

    客户端将只有MiddleEarthCreature 的接口,但类路径中没有任何实现。

    Creature 的实现是ElfManDwarfHobbit 类型的可序列化对象。而且这些实现位于您的代码库中,而不是您客户端的类路径中。

    当您要求 RMI 服务器向您发送中土世界所有生物的列表时,它会发送实现 Creature 的对象,即上面列出的任何类。

    当客户端接收到序列化的对象时,它必须查找类文件以便对它们进行反序列化,但这些文件不在本地类路径中。此流中的每个对象都带有给定的代码库标记,可用于查找缺失的类。因此,客户端求助于代码库来查找这些类。它会在那里找到正在使用的实际生物类别。

    代码库双向工作,因此这意味着如果您向服务器发送Creature(即Ent),它也会在代码库中查找它。

    这意味着当客户端和服务器都需要发布新类型的生物时,他们所要做的就是更新代码库中的creaturesImpl.jar,而不是服务器或客户端应用程序本身。

    【讨论】:

    • 既然一切都在服务器上运行,为什么客户端想知道服务器如何实现接口?客户端需要知道的只是接口,所以它可以调用客户端的方法。我错了吗?
    • @Simil 我们正在讨论您和服务器交换的可序列化对象。请参阅我编辑的答案。
    • @Edwin - “代码库”的优势也是如此,任何新的实现只需要在“代码库”中更新,服务器或客户端可以从“代码库”中获取它,而不必提供每个客户端或服务器的类/jar?此外,虽然它可能不是可取的——“代码库”是强制性的——我的意思是我可以避免使用“代码库”吗?(即使它是糟糕的设计)。因此,如果服务器和客户端有必要的 jar 并且我不打算更改任何内容 - 我不需要正确配置“代码库”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多