Java中的动态代理是什么_Java动态代理实现机制解析

Java动态代理是在运行时自动生成代理对象的机制,核心是InvocationHandler接口与Proxy类,仅支持基于接口的代理,需定义接口、实现类、处理器并调用newProxyInstance创建代理,相比静态代理复用性

更高。

Java中的动态代理,是一种在程序运行时自动创建代理对象的机制,不需要提前编写代理类源码。它的核心价值在于:不修改原始类的前提下,对方法调用进行拦截、增强或控制,比如加日志、做权限检查、统计耗时、实现事务管理等。

动态代理的关键组成

要实现JDK动态代理,必须配合两个核心组件:

  • InvocationHandler 接口:你得自己写一个实现类,重写 invoke(Object proxy, Method method, Object[] args) 方法。所有被代理接口的方法调用,最终都会落到这个方法里处理。
  • Proxy 类:JDK 提供的工具类,主要靠 newProxyInstance(ClassLoader, Class>[], InvocationHandler) 这个静态方法,传入类加载器、目标接口数组和你的处理器,就能生成一个代理对象。

为什么必须有接口

JDK 动态代理只支持“基于接口”的代理。这是因为 Proxy 生成的代理类本质上是实现了你指定的一组接口,而不是继承某个类。如果目标类没有实现任何接口,就无法用 JDK 动态代理,此时可考虑 CGLIB(基于子类继承)。

举个例子:UserService 接口 + UserServiceImpl 实现类 → 可以代理;只有 UserDAO 类且没接口 → JDK 动态代理不可用。

典型使用流程

实际编码中一般按这四步走:

  • 定义业务接口(如 UserService
  • 编写真实实现类(如 UserServiceImpl
  • 实现 InvocationHandler,内部持有真实对象,并在 invoke 中决定是否调用原方法、何时加日志、怎么处理异常等
  • 调用 Proxy.newProxyInstance(...) 创建代理实例,再把它转型成业务接口类型来使用

它和静态代理的区别

静态代理需要你手动为每个被代理类写一个代理类,代码重复多、维护成本高;而动态代理把代理逻辑统一收口到 InvocationHandler,一套处理器能适配多个接口,复用性高,也更符合开闭原则。

比如加日志功能,静态代理要在每个代理类里写一遍 log,动态代理只需在一个 invoke 方法里统一加一次。