Reflection API中的代理是什么?

时间:2012-11-07 10:41:20

标签: java reflection proxy

我正在学习反思的概念,而我正在阅读“Java Reflection In action”一书。我刚刚开始使用“代理”一章,它说“代理,支持接口 另一个对象,它的目标,以便代理可以为所有实际目的替换目标“。

我可以通过一个真实的生活简单例子来理解这个代理概念吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

然而,以下是可以使用代理的“经典”区域:

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

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

在论文“On the design of the ECMAScript Reflection API”中,作者在两种主要代理之间进行了贬低:

  

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

     

虚拟对象。模仿的代理人   其他对象,没有必须存在的模拟对象   相同的地址空间。示例包括远程对象代理   (模拟其他地址空间中的对象),持久对象(模拟   存储在数据库中的对象),透明的未来(不模仿对象)   但计算过的,懒惰的实例化对象,测试模型等等。

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