热插拔Java类

时间:2015-05-26 10:51:46

标签: java

我一直在研究一个基于Java的小型在线游戏,虽然还没有完成,但我想在某个时候发布它。我不认为它很快就会完成,然而,所有缺失的都是一些持续的故事部分。我想通过互联网连接修补游戏的更新(正如大多数游戏所做的那样) - 但我希望能够聪明地使用它并使用某种形式的热交换来修补更新,而无需重新加载游戏。

最初,我认为JRebel可以用于此目的,但据我所知,它不容易从应用程序本身调用。

我设想这个过程的方式是:

  1. 服务器告诉客户端有可用的更新
  2. 客户端下载ZIP / JAR /其他内容并将其解压缩
  3. 客户端在“包类”中加载,它修改了运行的图像(客户端具有专门构造的部分,旨在处理其他类中的加载,并可能覆盖现有的类。)
  4. 'package class'处理内存类表示的覆盖。
  5. 困扰我的部分是,如果我有一个物体,即

        //Something that's called when the app loads up
        CustomClass drawClass = new CustomClass();
        drawClass.setContext(Context.MAIN);
        //...More calls that set up drawClass
    

    我希望能够修改CustomClass并将其反映在CustomClass的所有实例中。我对此充满希望的唯一原因是我可以在每个类中构建一个基本上序列化它的“copyMe” - 它可以加载到新类中。

    我可以这样做吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:1)

我认为您可以使用SPI

解决一些必需的功能

在您的代码中,您可以构建一个自定义类加载器,该类加载器使用ServiceLoader找到的实现。

虽然我认为您需要找到可以在这些类上重用的自定义序列化。例如,您可以使用gson并将感兴趣的字段序列化为json。较新的实现可以反序列化,并且您支持版本控制等。

答案 1 :(得分:1)

如果你想允许任意更新,我认为你正在购买一个受伤的世界 正在运行的程序的一部分。我不是说这是不可能的,只是它是 很难做到正确,特别是考虑到缺失或失败的中间更新。

相反,使用“暂停游戏/简历游戏”功能,将其包裹起来,使其对用户不可见,从旧版本过渡到 更新版本。