Java 动态代理详解与实战示例
Java 动态代理是一种强大的技术,允许在运行时为接口创建代理对象,并通过统一的拦截器逻辑添加行为。这种机制在 Spring、MyBatis 等框架中被广泛应用。本文将围绕 JDK 动态代理,深入讲解原理、用法及实际应用。
1. 什么是动态代理?
动态代理是指在程序运行时通过反射机制动态创建代理对象,无需手动编写代理类。
Java 中提供了两种主流代理技术:
代理类型 | 描述 | 适用场景 |
---|---|---|
JDK 动态代理 | 基于接口,使用 Proxy 实现 |
目标类实现了接口 |
CGLIB 动态代理 | 基于类,生成子类实现代理 | 无接口的普通类 |
本文聚焦 JDK 动态代理。
2. 动态代理原理核心组件
2.1 InvocationHandler
接口
这是所有动态代理逻辑的核心,代理对象的方法调用都会被转发到它的 invoke()
方法中:
public interface InvocationHandler {
Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}
2.2 Proxy
类
用于生成代理对象:
public static Object newProxyInstance(
ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
3. 动态代理基础实战
3.1 定义业务接口及实现类
// 业务接口
public interface HelloService {
void sayHello(String name);
}
// 接口实现类,包含核心业务逻辑
public class HelloServiceImpl implements HelloService {
@Override
public void sayHello(String name) {
System.out.println("Hello, " + name);
}
}
3.2 定义通用的 InvocationHandler
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class