joinPoint.proceed();手写代码实现
时间: 2024-05-06 08:19:44 浏览: 88
为了手写实现`joinPoint.proceed()`,需要先了解AOP的原理。AOP(Aspect-Oriented Programming)是面向切面编程,它通过将横切关注点(如日志记录、性能统计、安全控制等)从业务逻辑中分离出来,然后通过“切面”织入到系统中。在实现AOP时,需要用到代理技术。
代理技术分为静态代理和动态代理。静态代理需要手动编写代理类,在编译期就确定了代理对象,因此不够灵活。而动态代理则是在运行期动态生成代理对象,因此更加灵活。常用的动态代理有JDK动态代理和CGLIB动态代理。
在JDK动态代理中,代理对象需要实现InvocationHandler接口,并重写invoke()方法,该方法中需要调用被代理对象的方法。因此,在实现`joinPoint.proceed()`时,我们需要创建一个InvocationHandler的实现类,用来作为代理对象的调用处理程序。我们的实现类需要在invoke()方法中调用被代理对象的方法,并返回其返回值。
以下是一个简单的实现示例:
```
public class MyInvocationHandler implements InvocationHandler {
private Object target; // 被代理对象
public MyInvocationHandler(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;
}
}
```
在这个示例中,我们创建了一个MyInvocationHandler类,它实现了InvocationHandler接口。在invoke()方法中,我们先输出了方法执行前的日志,然后调用了被代理对象的方法,并将返回值保存在result变量中。最后,我们又输出了方法执行后的日志,并将result返回。
在实际使用中,我们需要使用Proxy类的静态方法newProxyInstance()来创建代理对象。以下是使用示例:
```
// 创建被代理对象
MyService myService = new MyServiceImpl();
// 创建InvocationHandler实现类的实例
MyInvocationHandler handler = new MyInvocationHandler(myService);
// 创建代理对象
MyService proxy = (MyService)Proxy.newProxyInstance(
MyService.class.getClassLoader(),
new Class[]{MyService.class},
handler
);
// 调用代理对象的方法
proxy.doSomething();
```
在这个示例中,我们先创建了一个被代理对象MyServiceImpl,然后创建了一个MyInvocationHandler实例,并将MyServiceImpl对象作为参数传递给它。接着,我们使用Proxy类的newProxyInstance()方法创建了代理对象,并指定了代理对象实现的接口和调用处理程序。最后,我们调用代理对象的方法doSomething()。
在调用代理对象的方法时,实际上是调用了MyInvocationHandler中的invoke()方法,在该方法中调用了被代理对象的方法,并添加了切面逻辑。因此,我们实现了`joinPoint.proceed()`的功能。
阅读全文