多态是动态代理的底层骨架,支撑其“统一接口、差异化行为”能力;代理类与目标类实现同一接口,jvm通过运行时动态绑定调用对应invoke逻辑,实现解耦、横切关注点注入及框架插件化扩展。

多态在动态代理中不是辅助特性,而是支撑其存在和运转的底层骨架。没有多态,动态代理就无法实现“统一接口、差异化行为”的核心能力。
让代理对象能替代真实对象被调用
动态代理生成的代理类(如 JDK Proxy 创建的 $Proxy0)必须实现与目标对象相同的接口。JVM 在运行时通过多态机制,允许用接口类型引用指向代理实例,并调用其方法——此时实际执行的是代理类中重写的逻辑(比如日志、权限校验),而非目标对象原生方法。这依赖于“编译期看接口声明,运行期看实际对象类型”的动态绑定规则。
- 接口定义行为契约,代理类和目标类都实现它,满足“同一接口”前提
- InvocationHandler 中的 invoke() 方法封装了通用增强逻辑,所有代理调用最终汇聚于此
- 客户端代码只面向接口编程,完全 unaware 代理还是真实对象,彻底解耦
支撑运行时灵活切换行为逻辑
动态代理的价值在于“不改一行业务代码,就能插入横切关注点”。这种灵活性正来自多态的运行时决议能力:同一个接口方法调用,在不同场景下可由不同代理对象响应——比如测试环境走 Mock 代理,生产环境走带监控的代理,甚至按参数动态路由到不同策略代理。
- 无需 if-else 判断类型,靠 JVM 自动分发到对应代理实例的 invoke 实现
- 新增代理逻辑只需实现 InvocationHandler,不修改已有接口或业务类
- Spring AOP 的 @Before、@Around 等增强,本质都是多态驱动的代理链执行
使框架具备插件化与可扩展性
像 Spring、MyBatis 这类框架大量使用动态代理,根本原因在于多态提供了标准接入点。只要新组件遵循相同接口并提供自己的 InvocationHandler 或 Advice 实现,就能无缝集成到代理链中,无需框架源码改动。
- 事务管理、缓存、重试、熔断等能力,都以“实现特定接口 + 注入代理机制”方式叠加
- 接口是契约,多态是执行契约的机制,二者结合形成可组合、可替换的能力单元
- 用户自定义的切面(Aspect)之所以能生效,正是因为多态确保了它的 advice 被正确织入调用链
多态在这里不是语法糖,而是连接抽象与实现、静态契约与动态行为的关键桥梁。它让代理不再只是“转发”,而成为可编程、可配置、可演进的运行时基础设施。











