JoinPoint和ProceedingJoinPoint 知识点
Advice 具体知识点请看文章末尾链接
**
JoinPoint
**
JoinPoint其实就是封装了切点方法相关的信息,
@Before("execution1()")
public void testExecution(JoinPoint joinPoint){
Log.e(TAG, "testExecution ----: "+joinPoint.toString() );
}
JoinPoint方法详解
public interface JoinPoint {
String toString(); //连接点相关信息
Object getThis(); //返回AOP代理对象
Object getTarget(); //返回目标对象
Object[] getArgs(); //返回切点方法参数列表
Signature getSignature(); //返回当前连接点签名
SourceLocation getSourceLocation();//返回连接点方法所在类文件中的位置
String getKind(); //连接点类型
StaticPart getStaticPart(); //返回连接点静态部分
}
ProceedingJoinPoint
ProceedingJoinPoint是JoinPoint的子接口,该对象只用在@Around的切面方法中
@Around("execution(* *..MainActivity.testAOP())")
public void onActivityMethodAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
String key = proceedingJoinPoint.getSignature().toString();
Log.e(TAG, "onActivityMethodAroundFirst: before " + key + "do something");
//执行原方法
proceedingJoinPoint.proceed();
Log.e(TAG, "onActivityMethodAroundSecond: after " + key + "do something");
}
关键点在于proceed()方法,有没有发现,这个流程不就是代理模式吗?
方法详解
/**
* ProceedingJoinPoint exposes the proceed(..) method in order to support around advice in @AJ aspects
*
* @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
*/
public interface ProceedingJoinPoint extends JoinPoint {
/**
* 执行目标方法
*
* @return
* @throws Throwable
*/
public Object proceed() throws Throwable;
/**
* 传入的新的参数去执行目标方法
*
* @param args
* @return
* @throws Throwable
*/
public Object proceed(Object[] args) throws Throwable;
}
转载地址 :https://www.jianshu.com/p/ed7ece80a54d