Java:强大的代码移动性如何实现?

Java:强大的代码移动性如何实现?,java,dynamic-class-loaders,dynamic-class-creation,Java,Dynamic Class Loaders,Dynamic Class Creation,有没有人知道如何使用Java来完成任务?你以前做过吗 以下是我努力实现的目标 假设我们有两个独立的Java应用程序通过网络进行通信。应用程序A和应用程序B 应用程序A将类x实例化为对象,并且一直在使用它。应用程序B事先不了解此类x 应用程序A需要将类x的实例迁移到应用程序B。应用程序B应该能够动态加载类x,并保留类x的状态 我在谷歌上搜索了一下,找到了一些关于如何在运行时动态加载类的资源。但是,我不确定是否涵盖了通过网络传输对象实例及其状态以及动态调用对象实例的机制 任何指点都会很有帮助,提前谢

有没有人知道如何使用Java来完成任务?你以前做过吗

以下是我努力实现的目标

假设我们有两个独立的Java应用程序通过网络进行通信。应用程序A和应用程序B

应用程序A将类x实例化为对象,并且一直在使用它。应用程序B事先不了解此类x

应用程序A需要将类x的实例迁移到应用程序B。应用程序B应该能够动态加载类x,并保留类x的状态

我在谷歌上搜索了一下,找到了一些关于如何在运行时动态加载类的资源。但是,我不确定是否涵盖了通过网络传输对象实例及其状态以及动态调用对象实例的机制

任何指点都会很有帮助,提前谢谢你


注意:我最感兴趣的是如何解决这个问题(即方法、思维方式),而不是用什么来解决这个问题;这是因为我的任务是提出我自己的解决方案来解决这个问题。虽然指出库/框架很好,但如果答案是由以前做过类似工作的人发布的(无论多么罕见)。

有一个名为的项目,它可以在网络上动态移动对象。不过,我不确定执行状态。

在普通Java中,您需要某种方法让应用程序B加载对象的类,然后您需要将对象从应用程序A序列化到应用程序B。如果类在某个中心位置(如HTTP服务器)可用,您可能可以这样做。但是在一般情况下,如果您想将一个全新的对象传输到appb,您需要实现自己的类加载器(或者找到一个实现这个功能的库)


如果您的所有对象都是可序列化的,并且您有一个中心位置来存储这些类,那么实现起来应该相当简单。您可以使用URLClassLoader从http服务器加载类,然后使用普通Java序列化通过序列化对象进行传输。应用程序A和B之间需要一些协调,以便B知道加载哪个类,A知道何时发送对象,B知道如何继续执行对象的方法。使用这种方法,对象X可能无法执行方法;它必须停止,然后与应用程序A合作重新开始执行。

您询问的是强移动性,但您的要求是通过弱移动性来满足的,RMI协议提供了一些限制。RMI不仅支持RPC、对象序列化和分布式对象图,而且还支持通常使用的代码共享,以便客户端可以加载只有服务器知道的类的字节码,并在本地执行该字节码


Java不支持强大的移动性,如果不对VM进行专有扩展,我想不出实现它的方法。本质上,Java上下文中的强移动性意味着您在一个VM中挂起或暂停一个线程,传输从该线程可以访问的所有对象实例,可能是执行所需的字节码和内部线程st(调用堆栈等)重新创建线程状态,并在原始VM中暂停线程的位置继续执行

如果您使用的是JDK6,那么您可以发送源代码并对其进行编译,这样类加载器就可以找到这个新类,因为它是动态编译的

诀窍是,您可能需要使用一些DI将其加载到应用程序中,因此您需要一个能够动态工作的DI框架

然后,当它被注入到类中时,您可以在该点设置属性

它们应该有一个已知的接口。需要有一个双方都可以信赖的合同

我还没有尝试过,而且我认为Java不是正确的语言。如果您必须具有此功能,您可能希望查看类似于jvm脚本语言或Clojure的内容,因为我希望它也可以使用此功能,然后让您的java应用程序与此其他动态框架交互,因为它将在jvm上运行

更新:

这里是一个动态编译链接,使用JDK5,因为它可能是许多人不熟悉的东西


为了移动类C的实例I,需要将两件事情从A转移到B

首先是C的类定义(通常以字节码列表的形式),然后是I的序列化形式。请注意,您应该使用旧的二进制序列化的XML序列化instad

真正棘手的部分是转移C的依赖项,因为您需要转移C的所有超类,加上所有返回类型和字段类型,以及它们的超类和返回/字段类型等


如果您真的需要为所有可能的C值执行此操作,那么您最好使用一个设计用于执行此操作的框架,如grid one或Terracotta。如果你能约束自己,例如,一个给定的和狭窄的接口,你可能会更好。也可以考虑使用这些属性,因为它们非常简单,可以让你走远。

< p>我编写了一个开源代码库,它支持代码迁移,正如上面所提到的。实际上,它也支持RPC类型的使用

见:

就弱流动性与强流动性而言:居中


将对象传输到远程计算机时,可以控制在对象到达远程计算机时调用对象上的哪个方法以及使用哪个参数。因此,如果您正在编写一个移动代理,那么它可以自行决定如何在下一台机器上恢复执行,而不必从同一个位置恢复。

听起来很有趣!如果有人告诉我这个话题,我会