1

我正在学习反射的概念,并且正在阅读“Java Reflection In action”一书。我刚刚从“代理”一章开始,它说“一个代理,它支持另一个对象的接口,它的目标,因此代理可以代替目标用于所有实际目的”。

我可以举一个现实生活中简单的例子来理解这个代理的概念吗?

4

2 回答 2

1

经典示例是 RMI 代理,其中对本地代理对象进行的方法调用会导致对驻留在另一台机器上的另一个 JVM 中的代理对象的方法调用。

代理允许调用者将远程对象视为本地对象......在大多数方面。

于 2012-11-07T10:57:42.297 回答
1

好吧,代理只是一种机制,你可以做不同的事情,很多框架以各种方式使用它们。

然而,这里是可以使用代理的“经典”领域:

  • 访问控制:拦截调用并执行一些控制检查
  • 安全性:您可以在引用跨模块流动时包装/展开引用以执行检查并限制某些操作
  • 持久性:只有代理可用,数据从另一个存储介质按需加载
  • 延迟加载:代理仅在需要时加载或计算信息
  • 异步:代理是稍后可用的结果的句柄(所谓的透明未来)
  • 远程处理:代理提供了将对象本地化的假象,并处理远程通信
  • 合同:确保在调用之前和之后满足前置条件和后置条件
  • AOP:面向方面的编程依赖于拦截方法调用的能力。这样做的一种技术是使用代理。

注意:这些区域有一些重叠。

在论文“关于 ECMAScript 反射 API 的设计”中,作者区分了两种主要的代理:

通用包装器。将其他对象包装在同一地址空间中的代理。示例用途包括访问控制包装器(例如可撤销的引用)、高阶合同 [Findler 和 Felleisen 2002]、分析、污点跟踪等。

虚拟对象。模拟其他对象的代理,而模拟的对象不必存在于同一地址空间中。示例包括远程对象代理(模拟其他地址空间中的对象)、持久对象(模拟存储在数据库中的对象)、透明期货(模拟尚未计算的对象)、延迟实例化的对象、测试模型等。

我认为它或多或少涵盖了我之前描述的领域。但没有清单是完整的。代理没有固定的案例——它是一种通用的机制或原则。

于 2012-11-07T11:00:11.620 回答