AOP简单应用(二)-Pointcut篇

前言

上一批AOP简单应用(一)-execution篇简单的介绍了下execution--切点,本篇主要讲解下Pointcut--插桩。切面找到了,下一步就是要植入代码了。

使用

以hock点击事件为例进行讲解:
第一:
hock每一个事件之前,我们都要先搞清楚切点是什么?点击事件的切点就比较简单了,前文已经介绍:execution(* android.view.View.OnClickListener.onClick(..)),那我们的第一个方法就是定切点,写法如下:

    @Pointcut("execution(* android.view.View.OnClickListener.onClick(..))")
    public void click() {

    }
  • @Pointcut,字面意思就是切点,上图的意思就是说,我们要在android.view.View.OnClickListener.onClick这个路径下的onClick()方法中,插入click()方法,这个click()方法的名称可以自定义。
    第二:
    插入的click()方法是在onClick()方法的什么位置执行呢?方法前?方法后?还是需要阻断式执行?第二步便是要定义我们方法的执行位置,以及执行的具体方法代码。
    @After("click()")
    public void clickAspect(JoinPoint joinPoint) {
        Log.d("ClickAspect", "点击事件采集");
    }
  • After:在插桩方法执行后执行要插入的代码;
  • Before:在插桩方法执行前执行要插入的代码;
  • Around:环绕方法执行。用于替代原有代码,可以进行代码阻断调用,控制原方法的调用时机;
  • AfterReturning:在方法执行后,返回一个结果再执行,如果没结果,用此修辞符修辞是不会执行的;
  • AfterThrowing:在方法执行过程中抛出异常后执行,也就是方法执行过程中,如果抛出异常后,才会执行此切面方法。

AfterBefore使用方式都一样,唯一有区别的就是Around,它的使用跟其他几种区别较大。因为Around可以自己来控制原始代码的执行与否,所以可以进行阻断式插入代码,入参也与其他不同,需要使用ProceedingJoinPoint,如:

    @Around("click()")
    public void clickAspectj(ProceedingJoinPoint joinPoint) throws Throwable{
        //执行原始代码
        joinPoint.proceed();
    }

ProceedingJoinPointJoinPoint的一个子接口,其公开的方法有两个:

public Object proceed() throws Throwable;

public Object proceed(Object[] args) throws Throwable;

下篇将介绍入参JoinPoint和环绕入参ProceedingJoinPoint

未完,待续。。。

你可能感兴趣的:(AOP简单应用(二)-Pointcut篇)