前言
上一批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:在方法执行过程中抛出异常后执行,也就是方法执行过程中,如果抛出异常后,才会执行此切面方法。
After
和Before
使用方式都一样,唯一有区别的就是Around
,它的使用跟其他几种区别较大。因为Around
可以自己来控制原始代码的执行与否,所以可以进行阻断式插入代码,入参也与其他不同,需要使用ProceedingJoinPoint
,如:
@Around("click()")
public void clickAspectj(ProceedingJoinPoint joinPoint) throws Throwable{
//执行原始代码
joinPoint.proceed();
}
ProceedingJoinPoint
是JoinPoint
的一个子接口,其公开的方法有两个:
public Object proceed() throws Throwable;
public Object proceed(Object[] args) throws Throwable;
下篇将介绍入参JoinPoint
和环绕入参ProceedingJoinPoint
。
网友评论