2010-05-06 106 views
1

是否有方便的方式通过网络(而不仅仅是实例数据)传输对象,包括其代码(类)?通过网络传输java.lang.reflect.Proxy

不要问我为什么要这样做。这是一个任务。我问了好几次,如果这真的是他们的意思,并且没有改变他们的答案,我想他们真的希望我们通过网络传输代码(而不仅仅是现场数据)。说实话,我不知道为什么我们在这项任务中需要一个代理服务器,只要写一个简单的课程就可以实现IMO。该任务说我们应该在服务器上实例化代理并将其传输给客户端(是的,他们谈论java.lang.reflect.Proxy,他们命名这个类)。由于没有用于代理的类文件,我无法部署该文件。我想我必须以某种方式读出生成的代理的字节码,将其传输到客户端,然后加载它。这完全没有意义,但这似乎是他们希望我们做的。我不明白为什么。

+0

你确定他们不希望你远程调用代码吗?这是对客户端上的代理的调用,实际上是执行服务器上的代码并将结果返回给客户端? – Yishai 2010-05-06 21:39:49

+0

Yishai在这里可能是正确的 - 代理对象通常用于允许通过线路传输请求。我会建议阅读位于这里的java.lang.reflect.Proxy java文档:http://java.sun.com/javase/6/docs/api/java/lang/reflect/Proxy.html – aperkins 2010-05-06 21:41:18

+0

我知道什么是代理类很适合。另一个演讲的练习是写一个RMI,就像中间件,我真的很喜欢。我写了自己的序列化框架,网络传输,非常基本的命名,很多使用注释和反射,以便生成很好的代理等。 在本练习中,主要重点是编写一个透明复制的系统,我们必须隐藏事实服务器使用代理进行复制。这个任务确实说明我们必须在服务器上实例化代理,然后代理将被客户端使用。 – panzi 2010-05-07 02:47:11

回答

1

这是Apache River项目(以前称为Jini,当它由Sun运行时)的核心价值主张。

您将需要远程运行的代码放在“代码库”http服务器上的jar中,然后将代理发布到查找服务器。 River使用代码库URL注释该代理(这是一个序列化的实例)。当客户端从查找服务器获取代理并实例化代理时,代码库jar将用于沙盒类加载器中。创建“智能代理”是很常见的,它可以加载一些代码在客户端上运行,以管理通信回源服务,或者使用更简单的代理来进行RMI调用。

河流封装的技术复杂而深奥。

+0

这的确听起来像这里打算做的。 (尽管如此,谈到我们的任务,我不明白为什么我们应该做这样的事情,对于任务的静态设置非常复杂,而且练习的重点完全不同。) – panzi 2010-05-08 12:10:24