Java 动态代理核心原理与实战
在 Java 开发中,代理模式是设计模式的经典应用之一。而动态代理作为其进阶形式,在框架开发(如 Spring AOP)、日志记录、权限控制等场景中发挥着关键作用。它允许我们在程序运行时动态生成代理类,而非在编译期预先定义,从而无需为每个目标类手动编写代理代码即可统一添加横切逻辑。
核心概念
动态代理主要包含三个核心角色:
- 目标类(Target):被代理的原始类,包含核心业务逻辑。
- 代理类(Proxy):运行时动态生成的类,持有目标类引用,负责调用目标方法并增强逻辑。
- 增强逻辑(Advice):需统一添加的横切逻辑,如日志打印、参数校验等。
这种机制的核心价值在于降低代码耦合度,让业务逻辑与辅助功能分离。
JDK 动态代理(基于接口)
JDK 动态代理依赖 java.lang.reflect 包下的 Proxy 和 InvocationHandler 接口。要求目标类必须实现至少一个接口。运行时,JVM 会动态生成一个实现目标接口的代理类,代理类的方法调用会转发到 InvocationHandler 的 invoke 方法中,在该方法中可嵌入增强逻辑并调用目标方法。
示例代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;
// 1. 定义接口
public interface UserService {
void addUser(String name);
}
// 2. 实现目标类
public class UserServiceImpl implements UserService {
@Override
public void addUser(String name) {
System.out.println("添加用户:" + name);
}
}
// 3. 实现 InvocationHandler(增强逻辑)
public class LogInvocationHandler implements InvocationHandler {
private 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();
}
}


