一、引言
动态代理是Java中一种强大的设计模式,它能够在运行时动态创建接口或类的代理对象。与静态代理需要手动编写代理类不同,动态代理可以自动生成代理类,使代码更加简洁和灵活。Java中主要有两种动态代理机制:基于接口的JDK动态代理和基于类的CGLIB动态代理。
二、JDK动态代理实现原理
JDK动态代理通过java.lang.reflect.Proxy类实现,它要求目标对象必须实现至少一个接口。
下面通过一个完整示例来理解JDK动态代理的实现:
// 定义服务接口
public interface UserService {
void createUser(String username);
void deleteUser(Long userId);
}
// 实现服务接口
public class UserServiceImpl implements UserService {
@Override
public void createUser(String username) {
System.out.println("创建用户: " + username);
}
@Override
public void deleteUser(Long userId) {
System.out.println("删除用户: " + userId);
}
}
// 实现InvocationHandler接口,定义代理行为
public class LoggingInvocationHandler implements InvocationHandler {
// 持有目标对象的引用
private final Object target;
public LoggingInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 方法执行前的处理
System.out.println("准备执行方法: " + method.getName());
long startTime = System.currentTimeMillis();
try {
// 调用目标对象的方法
Object result = method.invoke(target, args);
// 方法执行后的处理
long endTime = System.currentTimeMillis();
System.out.println("方法执行完成,耗时: " + (endTime - startTime) + "ms");
return result;
} catch (Exception e) {
// 异常处理
System.err.println("方法执行异常: " + e.getMessage());
throw e;
}
}
}
// 创建动态代理的工具类
public class ProxyFactory {
@SuppressWarnings("unchecked")
public