在另一个类加载器中调用具有复杂对象参数的方法的干净/快速方法是什么?

时间:2011-12-02 17:15:21

标签: java classloader

我们正致力于通过不同版本的处理器运行处理的情况。我们在不同的类加载器中加载每个版本。但是我们需要调用的API使用我们自己的类,这些类可能会在不同版本上发生变化。因此,类可能在调用者类加载器中具有与被调用者类加载器中的定义不同的定义。

我正在寻找一种处理这种情况的高性能方法。我的理解是,对象序列化可能是一个重要的性能损失,如果类已经足够改变,它将根本不起作用。

限制:我们无法修改我们想要调用的代码。我们可能在callee类加载器中包含新代码,但我们无法修改我们尝试运行的代码。

2 个答案:

答案 0 :(得分:0)

您可以使用由系统类加载器加载的接口或抽象类,这些接口或抽象类由不同的处理器版本实现。现在,当您将处理器实现加载到它们自己的自定义类加载器中时,它们仍将链接来对应来自系统类加载器的接口,因此所有实现相同的表面。结果与Java一样快,但您需要在不同版本中保持稳定的接口。

答案 1 :(得分:0)

我在最后几天考虑过这个,这是一个有趣的问题。

虽然我认为根本不可能做到你想做的事情,但我提出了一个复杂的解决方案,但它可以帮助你,我希望。

使用旧版本的类启动VM,为其提供RMI方法。然后从您的调用者类加载器启动RMI连接到另一个VM,以从那些不是类的实例的旧数据集中获取数据集,但是Standart Java Objects(如Map)。 然后将调用者站点上的Map传输到您需要的版本的实例中。

这样,您就不会在单个VM中出现类的冲突版本。

如果需要,我可以为您提供一些示例代码来演示我的意思,但在您面前有很多实现:)

至于性能部分:如果构建通信RMI部件的接口足够紧,RMI Overhead不会花费太多,并且在每个VM中都没有大的序列化问题。

玩得开心(如果你在意的话,留下关于结果的说明)