动态代理是 Java 里一个很实用的机制——你不用为每个类单独写代理,就能给一堆方法织入横切逻辑。Spring AOP 背后靠的就是它。不过,Java 原生提供了一种动态代理方案,但还有第三方的 CGLIB 常被用到,两者思路不同,场景也不一样。

简单说,动态代理是在运行时生成代理类,而不是编译前写死的。这里面有三个角色:目标类、代理类和增强逻辑(Advice)。你调代理的方法,它会在中间插一脚,执行增强逻辑后再调目标方法。

JDK 动态代理要求目标类必须实现接口。它用 Proxy 和 InvocationHandler 生成一个实现了那些接口的代理类,方法调用都会被转发到 invoke 方法里。你在 invoke 里可以写日志、权限检查,然后再调用目标方法。

下面是一个用日志增强的完整例子:
// 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 {
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();
}
}



