JDK动态代理是Java原生轻量级AOP实现,基于接口在运行时生成代理对象,核心为Proxy.newProxyInstance()配合InvocationHandler;必须有接口,代理类继承Proxy并实现指定接口;InvocationHandler的invoke方法统一拦截所有接口方法调用,支持前置、后置及异常处理;创建需ClassLoader、接口数组和InvocationHandler三要素;代理对象只能转为接口类型,不可转为目标实现类。

JDK 动态代理是 Java 原生支持 AOP 的最轻量方式,它不修改原始类,也不依赖框架,只通过接口在运行时生成代理对象,把横切逻辑(如日志、权限、事务)织入方法调用前后。核心就是 Proxy.newProxyInstance() 配合 InvocationHandler。
必须基于接口,不能代理类
动态代理只能为接口生成代理实例,目标类必须实现至少一个接口。JVM 生成的代理类继承自 java.lang.reflect.Proxy,并实现你传入的接口数组——这是硬性限制。如果你只有普通类没有接口,得先提取公共行为定义成接口,否则得换 CGLIB(但那是另一套机制)。
InvocationHandler 是横切逻辑的入口
所有被代理接口的方法调用,最终都会进入 invoke(Object proxy, Method method, Object[] args) 方法。在这里你可以:
- 在
method.invoke(目标对象, args)前插入前置逻辑(比如校验权限) - 在调用后处理返回值或记录耗时(比如性能监控)
- 捕获异常做统一处理(比如事务回滚)
- 对
toString()、hashCode()、equals()等 Object 方法可选择是否拦截
创建代理对象三要素缺一不可
调用 Proxy.newProxyInstance() 时要传入:
立即学习“Java免费学习笔记(深入)”;
-
ClassLoader:用于加载生成的代理类,通常用目标对象的类加载器(
target.getClass().getClassLoader()) -
接口数组:如
new Class[]{Service.class, Loggable.class},代理对象将实现全部这些接口 - InvocationHandler 实例:封装了你的增强逻辑,是真正执行“切面”的地方
代理对象只能按接口类型使用
生成的代理对象不是目标类的子类,不能强转成具体实现类类型,只能强制转换为你指定的接口类型。例如:Service proxy = (Service) Proxy.newProxyInstance(...);
如果试图转成 ServiceImpl 会抛 ClassCastException。


















