手写JDK动态代理实现AOP
以下是一个简单的例子,展示了如何使用JDK动态代理来实现AOP中的前置通知(Before Advice)。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
// 定义一个前置通知的接口
interface BeforeAdvice {
void before(Object proxy, Method method, Object[] args);
}
// 实现InvocationHandler接口
class MyInvocationHandler implements InvocationHandler {
private Object target; // 目标对象
private BeforeAdvice beforeAdvice; // 前置通知
public MyInvocationHandler(Object target, BeforeAdvice beforeAdvice) {
this.target = target;
this.beforeAdvice = beforeAdvice;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 调用前置通知
beforeAdvice.before(proxy, method, args);
// 调用目标方法
return method.invoke(target, args);
}
}
// 测试目标对象
class MyTarget {
public void myMethod(String message) {
System.out.println("Target method called with: " + message);
}
}
// 测试前置通知
class MyBeforeAdvice implements BeforeAdvice {
@Override
public void before(Object proxy, Method method, Object[] args) {
System.out.println("Before advice: Method = " + method.getName() + ", Args = " + Arrays.toString(args));
}
}
public class JdkDynamicProxyExample {
public static void main(String[] args) {
MyTarget target = new MyTarget(); // 创建目标对象
BeforeAdvice beforeAdvice = new MyBeforeAdvice(); // 创建前置通知
InvocationHandler handler = new MyInvocationHandler(target, beforeAdvice); // 创建调用处理器
// 创建代理类
MyTarget proxy = (MyTarget) Proxy.newProxyInstance(
target.getClass().getClassLoader(), // 类加载器
target.getClass().getInterfaces(), // 目标对象的接口
handler // 调用处理器
);
// 通过代理调用方法
proxy.myMethod("Hello, Proxy!");
}
}
这段代码首先定义了一个BeforeAdvice接口和一个实现了InvocationHandler接口的MyInvocationHandler类。在MyInvocationHandler中,它在调用目标方法前调用了前置通知的before方法。然后,通过Proxy.newProxyInstance方法创建了一个代理类,并通过代理类调用了目标对象的方法。这个例子展示了如何使用JDK动态代理来实现简单的AOP功能。