我正在学习反射的概念,并且正在阅读“Java Reflection In action”一书。我刚刚从“代理”一章开始,它说“一个代理,它支持另一个对象的接口,它的目标,因此代理可以代替目标用于所有实际目的”。
我可以举一个现实生活中简单的例子来理解这个代理的概念吗?
我正在学习反射的概念,并且正在阅读“Java Reflection In action”一书。我刚刚从“代理”一章开始,它说“一个代理,它支持另一个对象的接口,它的目标,因此代理可以代替目标用于所有实际目的”。
我可以举一个现实生活中简单的例子来理解这个代理的概念吗?
经典示例是 RMI 代理,其中对本地代理对象进行的方法调用会导致对驻留在另一台机器上的另一个 JVM 中的代理对象的方法调用。
代理允许调用者将远程对象视为本地对象......在大多数方面。
好吧,代理只是一种机制,你可以做不同的事情,很多框架以各种方式使用它们。
然而,这里是可以使用代理的“经典”领域:
注意:这些区域有一些重叠。
在论文“关于 ECMAScript 反射 API 的设计”中,作者区分了两种主要的代理:
通用包装器。将其他对象包装在同一地址空间中的代理。示例用途包括访问控制包装器(例如可撤销的引用)、高阶合同 [Findler 和 Felleisen 2002]、分析、污点跟踪等。
虚拟对象。模拟其他对象的代理,而模拟的对象不必存在于同一地址空间中。示例包括远程对象代理(模拟其他地址空间中的对象)、持久对象(模拟存储在数据库中的对象)、透明期货(模拟尚未计算的对象)、延迟实例化的对象、测试模型等。
我认为它或多或少涵盖了我之前描述的领域。但没有清单是完整的。代理没有固定的案例——它是一种通用的机制或原则。