JDK 动态代理和 CGLIB 代理是 Java 中两种常见的动态代理技术。它们的核心作用是 在运行时生成代理对象,用于增强原始对象的功能(如 AOP 切面编程、拦截方法调用等)。
① JDK 动态代理
JDK 动态代理基于 java.lang.reflect.Proxy
和 InvocationHandler
接口。它 仅能代理实现了接口的类,通过 Proxy.newProxyInstance
方法在运行时生成代理对象。
工作原理
- 代理类实现目标接口,并在
invoke
方法中拦截所有方法调用。 - 代理对象是
Proxy
类的子类,JVM 在运行时动态生成该类。 - 调用方法时,代理对象会调用
InvocationHandler
的invoke
方法。
示例
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 1. 定义接口
interface UserService {
void save(String name);
}
// 2. 目标对象
class UserServiceImpl implements UserService {
@Override
public void save(String name) {
System.out.println("保存用户: " + name);
}
}
// 3. 创建 InvocationHandler 处理器
class MyInvocationHandler implements InvocationHandler {
private final Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("日志: 方法 " + method.getName() + " 被调用,参数:" + args[0]);