2020-09-19 Android AOP 之 AspectJ

2020-09-24  本文已影响0人  馒Care

AspectJ简单使用

1.首先创建一个注解类,

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION)
annotation class AopCommand
其中@Target(AnnotationTarget.FUNCTION)表示该注解只能用在方法上。

2.创建Aspect实现类,用来过滤和实现日志打印,@Aspect:声明切面,标记类,使用下面注解之前一定要在类使用@Aspec

@Aspect
class AopAspect{
    @Pointcut("execution(@com.example.aopaspectj.log.AopCommand * *(..))")    fun pointcut() {
    }

    @Around("pointcut()")
    @Throws(Throwable::class)
    fun AopAround(joinPoint: ProceedingJoinPoint) {        
        Log.d("zhuanghz", "-----先将强哥绑起来-----")   
    }
}

3.执行的方法

@AopCommand
fun luQiangGe() {   
 Log.d("zhuanghz", "-----撸强哥-----")
}

4.运行结果如下:

D/zhuanghz: -----先将强哥绑起来-----

阿勒,竟然没有打印撸强哥。

别急,我们再来看下around方法,这边我们只是打印了日志,没有了其他操作,此时我们如果需要返回原来的目标方法,就需要调用proceed(),切到目标方法里。这边我们重新修改成如下代码:

    @Around("pointcut()")
    @Throws(Throwable::class)
    fun AopAround(joinPoint: ProceedingJoinPoint) {
        Log.d("zhuanghz", "-----先将强哥绑起来-----")
        joinPoint.proceed()
        Log.d("zhuanghz", "-----撸完走人-----")
    }

try again!

D/zhuanghz: -----先将强哥绑起来-----
D/zhuanghz: -----撸强哥-----
D/zhuanghz: -----撸完走人-----

强哥保佑,这次有了。

AspectJ Advice 的执行顺序
前面讲了AspectJ的集成和简单使用,接下来我们来了解下Advice的其他方法和执行顺序。
我们修改AopAspect类,在里面加入Advice其他的通知,先简单的加入几个通知的方法,代码如下:

    @Before("pointcut()")
    fun aopBefore() {    
        Log.d("zhuanghz", "-----Before-----")
    }

    @Around("pointcut()")
    @Throws(Throwable::class)
    fun aopAround(joinPoint: ProceedingJoinPoint) {              
          Log.d("zhuanghz", "-----Around 1-----")          
          joinPoint.proceed()
          Log.d("zhuanghz", "-----Around 2-----")  
  }

    @After("pointcut()")
       fun aopAfter() {    
            Log.d("zhuanghz", "-----After-----")
    }

    @AfterReturning(pointcut="pointcut()")
    fun aopReturning() {    
        Log.d("zhuanghz", "-----AfterReturning-----")
    }

    @AfterThrowing(pointcut  = "pointcut()", throwing = "throwable")
    fun aopThrowing(point:JoinPoint ,throwable: Throwable) {          
          Log.d("zhuanghz", "-----AfterThrowing-----")
    }

如果此时我们对异常代码块进行try-catch会怎样呢?

try.png

本次先简单了解下AspectJ的基础使用,后续再继续深入学习AspectJ。

对于刚刚学aop注意几个坑

上一篇 下一篇

猜你喜欢

热点阅读