Java 动态代理概述
在 Java 开发中,代理模式是常见的设计模式之一。动态代理作为其进阶形式,在框架开发(如 Spring AOP)、日志记录、权限控制等场景中发挥着关键作用。本文将从核心概念出发,拆解两种主流动态代理的实现逻辑,并分析其适用场景。

动态代理的核心概念
动态代理指在程序运行时,通过反射机制动态生成代理类,而非在编译期预先定义。其核心价值在于:无需为每个目标类手动编写代理类,即可统一为多个目标类添加横切逻辑(如日志、事务、异常处理),降低代码耦合度。

动态代理主要包含三个核心角色:
- 目标类(Target):被代理的原始类,包含核心业务逻辑;
- 代理类(Proxy):运行时动态生成的类,持有目标类引用,负责调用目标方法并增强逻辑;
- 增强逻辑(Advice):需统一添加的横切逻辑,如日志打印、参数校验等。
形象理解

JDK 动态代理(基于接口)
JDK 动态代理依赖 java.lang.reflect 包下的 Proxy 和 InvocationHandler 接口,要求目标类必须实现至少一个接口。运行时,JVM 会动态生成一个实现目标接口的代理类,代理类的方法调用会转发到 InvocationHandler 的 invoke 方法中,在该方法中可嵌入增强逻辑并调用目标方法。

示例代码
// 1. 定义接口
public interface UserService {
void addUser(String name);
}
// 2. 实现目标类
public {
{
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();
}
}


