
在 Java 开发中,代理模式是设计模式的常见应用,而动态代理作为其进阶形式,在框架开发(如 Spring AOP)、日志记录、权限控制等场景中发挥着关键作用。它允许我们在程序运行时通过反射机制动态生成代理类,无需为每个目标类手动编写代理代码,从而有效降低耦合度。

一、动态代理的核心概念
动态代理的核心在于运行时动态生成代理类。其价值在于:无需预先定义,即可统一为多个目标类添加横切逻辑(如日志、事务、异常处理)。
动态代理主要包含三个角色:
- 目标类(Target):被代理的原始类,包含核心业务逻辑;
- 代理类(Proxy):运行时动态生成的类,持有目标类引用,负责调用目标方法并增强逻辑;
- 增强逻辑(Advice):需统一添加的横切逻辑,如日志打印、参数校验等。

二、两种主流动态代理实现
Java 中主要有两种实现方式:JDK 动态代理(原生 API)和 CGLIB 动态代理(第三方库),二者在原理和使用上存在显著差异。
1. JDK 动态代理(基于接口)
原理
JDK 动态代理依赖 java.lang.reflect 包下的 Proxy 和 InvocationHandler 接口。要求目标类必须实现至少一个接口。运行时,JVM 会动态生成一个实现目标接口的代理类,代理类的方法调用会转发到 InvocationHandler 的 invoke 方法中,在该方法中可嵌入增强逻辑并调用目标方法。

示例代码
// 1. 定义接口
public interface UserService {
void addUser(String name);
}
{
{
System.out.println( + name);
}
}
{
Object target;
{
.target = target;
}
Object Throwable {
System.out.println( + method.getName() + + Arrays.toString(args));
method.invoke(target, args);
System.out.println( + method.getName() + );
result;
}
}
{
{
();
(UserService) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
(target)
);
proxy.addUser();
}
}



