【问题标题】:transmit a java.lang.reflect.Proxy over a network通过网络传输 java.lang.reflect.Proxy
【发布时间】:2010-05-06 21:35:16
【问题描述】:

有没有一种方便的方法可以通过网络传输对象包括其代码(类)(不仅仅是实例数据)?

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

【问题讨论】:

  • 您确定他们不希望您远程调用代码吗?那就是在客户端调用代理实际上是在服务器上执行代码并将结果返回给客户端?
  • Yishai 在这里可能是正确的 - 代理对象通常用于允许通过网络传输请求。我建议阅读 java.lang.reflect.Proxy java 文档,位于:java.sun.com/javase/6/docs/api/java/lang/reflect/Proxy.html
  • 我知道 Proxy 类有什么好处。另一堂课的练习是编写一个类似 RMI 的中间件,我真的很喜欢。我编写了自己的序列化框架、网络传输、非常基本的命名、大量使用注释和反射来生成好的代理等。在这个练习中,主要重点是编写一个透明复制的系统,我们必须隐藏这样一个事实:服务器使用代理进行复制。并且分配确实表明我们必须在服务器上实例化代理,然后代理将由客户端使用。

标签: java class proxy networking bytecode


【解决方案1】:

这是Apache River 项目(在 Sun 运营时以前称为 Jini)的核心价值主张。

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

River 封装的技术复杂,但意义深远。

【讨论】:

  • 这听起来确实像这里的意图。 (不过,说到我们的作业,我不明白为什么我们应该做这样的事情。作业的静态设置非常复杂,而且练习的重点完全不同。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多