美文网首页
AOP简单应用(二)-Pointcut篇

AOP简单应用(二)-Pointcut篇

作者: 海阔sun天空 | 来源:发表于2019-03-26 15:13 被阅读0次

    前言

    上一批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篇

          本文链接:https://www.haomeiwen.com/subject/fusiuqtx.html