Java 动态代理是一种在运行时创建代理类和实例的机制,它是通过 java.lang.reflect
包下的 Proxy
类和 InvocationHandler
接口来实现的。动态代理允许在运行时动态生成代理类,而不需要手动编写代理类的代码。
定义业务接口: 定义一个业务接口,代理类将实现这个接口。
实现 InvocationHandler 接口: 创建一个实现 InvocationHandler
接口的类,该类负责处理代理对象的方法调用。
创建代理类: 使用 Proxy.newProxyInstance
方法创建代理对象,该方法接受一个类加载器、一个接口数组和一个 InvocationHandler
对象。
以下是一个简单的动态代理的示例,实现了一个简单的日志记录功能:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface UserService {
void save();
}
class UserServiceImpl implements UserService {
@Override
public void save() {
System.out.println("Saving user data...");
}
}
class LogHandler implements InvocationHandler {
private Object target;
public LogHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method: " + method.getName());
Object result = method.invoke(target, args);
System.out.println("After method: " + method.getName());
return result;
}
}
public class DynamicProxyExample {
public static void main(String[] args) {
// 创建目标对象
UserService userService = new UserServiceImpl();
// 创建日志处理器
LogHandler logHandler = new LogHandler(userService);
// 创建动态代理对象
UserService proxy = (UserService) Proxy.newProxyInstance(
DynamicProxyExample.class.getClassLoader(),
new Class[]{UserService.class},
logHandler
);
// 调用代理对象的方法
proxy.save();
}
}
在上述示例中,LogHandler
类实现了 InvocationHandler
接口,负责处理代理对象的方法调用。通过 Proxy.newProxyInstance
方法创建了一个代理对象,该对象实现了 UserService
接口,并在每个方法调用前后添加了日志记录的功能。