Java 反射API中的代理有什么好处?

Java 反射API中的代理有什么好处?,java,reflection,proxy,Java,Reflection,Proxy,我正在学习反射的概念,正在阅读《Java反射在行动》一书。我刚刚从“Proxy”一章开始,它说“Proxy,支持 另一个对象是它的目标,以便代理可以在所有实际用途中替代目标” 请给我一个真实的简单示例来理解代理的概念好吗?经典示例是RMI代理,其中对本地代理对象进行的方法调用会导致对驻留在另一台机器上的另一个JVM中的代理对象进行方法调用 代理允许调用者将远程对象视为本地对象…在大多数方面。代理只是一种机制,您可以使用它做不同的事情,许多框架以不同的方式使用它们 然而,以下是可以使用代理的“经典

我正在学习反射的概念,正在阅读《Java反射在行动》一书。我刚刚从“Proxy”一章开始,它说“Proxy,支持 另一个对象是它的目标,以便代理可以在所有实际用途中替代目标”


请给我一个真实的简单示例来理解代理的概念好吗?

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

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

代理只是一种机制,您可以使用它做不同的事情,许多框架以不同的方式使用它们

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

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

在论文“”中,作者区分了两种主要的代理:

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

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


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

@gefei它在Java中有更具体的含义:谢谢。假设我有一个类Dog,在那里我有一个方法bark()。那么,在哪种情况下,我需要一个Dog类的代理呢?从这个定义来看,它听起来就像是在谈论
实现
。如果Dog代理真的是一个在远程机器上运行的实例的前端。你不必知道在你的应用程序中吠叫的狗是生活在你的地址空间还是世界各地。书中说——代理实现了与目标相同的接口,因此可以完全相同的方式使用它。代理将接收到的部分或全部调用委托给其目标,从而充当中介或替代。作为中介,代理可以在将方法转交给目标之前或之后添加功能。这给了反射式程序员向对象添加行为的能力——这是否意味着Dog类如果想要拥有它的代理,就必须实现interfcae?代理可以被视为java servlet过滤器吗?对于通用包装,是的。对于虚拟对象,没有。我发现这个链接是一个简单的例子。你同意吗?@user1805790同意什么?这个例子在技术上是有效的,但它本身没有什么意义。你可以在博文的底部阅读Mikhail Galyutin的评论。再次感谢。你知道任何这样的链接,提供这种简单的例子请?