动态代理是 Java 面试里的老题,但很多人一开口就直接背 API,结果主线不清。更好的讲法,是先说明它解决什么问题,再分成 JDK 动态代理和 CGLIB 两类来看。
先说明为什么需要动态代理
如果每个目标类都手写一个代理类,成本会非常高。动态代理的价值就在于把日志、事务、鉴权这类横切逻辑抽出来,通过统一方式织入目标对象。
JDK 动态代理基于接口
这一类适合目标对象本身实现了接口的场景。回答时重点说清楚它通过代理对象拦截方法调用,再交给统一处理逻辑,而不是只念类名。
CGLIB 更适合没有接口的类
如果目标类没有接口,通常会考虑基于继承生成子类的方式。这里顺手提一下 final 类和 final 方法的限制,会让回答更完整。
最好连到 Spring 场景
比如 AOP、声明式事务、远程调用代理,这些都是动态代理最常见的落地场景。把原理和框架实践连起来,比孤立背概念更有说服力。
结论
回答 Java 动态代理时,先讲“为什么需要”,再区分 JDK 代理和 CGLIB,主线会清楚很多。
正文完




