繁体   English   中英

将java类字节码从jvm移动到jvm

[英]moving java class bytecode from jvm to jvm

所以我有一个服务器jvm和一个客户端jvm。 客户端通过tcp发送序列化的java对象与服务器通信。 现在,通常服务器将拥有它在类路径中接收的对象的类,以便正确地反序列化对象。

但我正在寻找的是一些避免这种情况的方法; 即,让客户端“以某种方式”按需通过线路发送类字节码。 这当然需要递归类树(如果原始类的任何成员本身是服务器不知道的其他类的对象)。

所以我想知道那些做这类事情的技术。

谢谢。

RMI包含“类服务器”的概念。 听起来你几乎要重新发明,所以考虑使用全部或部分RMI。 这是一个教程。

RMI能够根据需要通过线路动态下载整个类文件定义

即使您不使用(或想要使用)RMI,类加载的技术也可能是有意义的,它们是标准的Java。

您在询问代码移动性 网格计算领域也有一定的相关性。

看一下Mobility-RPC ,它是一个完全按照你的粒度(类级别)提出要求的库。

安全是需要牢记的。 但我还记得SQL发送到数据库,通过SSH执行的bash命令,业务规则引擎,Adobe Flash,Java Applets,如上所述的RMI,ActiveX,JavaScript,Hadoop /网格计算框架 - 所有这些都是远程的例子代码执行广泛使用。 像所有东西一样,将安全转盘调到最大限制将限制您的选择。 但是,当适当的防火墙或沙箱时,所有上述用途都会产生良好的效果。

在这种情况下,听起来你想要一些东西来消除轻微的麻烦,而你(而不是)设计一个完整的分布式应用程序。 所以基于你所说的,尽管我自己是一个代码移动性支持者,但我认为在这种情况下代码移动性可能过度。 (但在其他人中很有用。)

关于网格计算,请看一下GridGainHadoop GridGain是一个纯粹的(以CPU为中心)网格计算框架,而Hadoop更像是一个拥有自己的复制分布式文件系统(HDFS)的数据挖掘/数据仓库平台。

GridGain和Hadoop都将用户定义的Java代码传输到远程工作节点。 上次我检查时,他们通过将用户提供的jar文件传输到相关节点来完成此操作。 我认为GridGain ClassLoader比Hadoop更复杂(但不如Mobility-RPC复杂)。 Hadoop基本上为每个作业启动一个新的JVM,不是特别有效(但不完全是IO负载的瓶颈!)。

Mobility-RPC有些不同,因为它根本不希望远程机器成为工作节点,它可能是运行库的任何应用程序。 所以它更像是RPC或临时任务/对象传输。

这听起来像个坏主意。 基本上,这意味着您允许客户端将代码发送到服务器,该服务器直接在当前进程内执行。 像这样的东西通常被认为是一个严重的漏洞,即任意代码执行 ,这是你可能遇到的最严重的漏洞之一。

建立一个基于此的系统设计,不是那么聪明。

创建一个从流中加载类的类加载器。 有关详细信息,请参阅JarFileClassLoader示例

当然,这将成为一个非常大的问题,特别是如果任何类使用反射并且不直接命名字节码中的实现,除了潜在的安全问题; 你需要研究安全的类加载器。

如果普通RMI不能满足您的要求,请查看Java中的移动代理框架(例如,Aglets)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM