切点方法返回值
普通函数¶
对于 @AndroidAopPointCut 和 @AndroidAopMatchClassMethod 这两种切面都有其切面回调处理类分别是
- @AndroidAopPointCut 对应 BasePointCut
- @AndroidAopMatchClassMethod 对应 MatchClassMethod
Note
可以看到 两个 invoke 方法都有一个返回值,这个返回值将会替换掉切入点方法的返回值,并且会自动转化为原方法的返回类型,但是以下两种类型,则没有返回值
返回值是什么¶
- 如果切面方法 有返回值 ,invoke 的返回值就是切面方法返回值
- 另外如果切面方法 有返回值 ,invoke 的返回值类型要和切面方法返回类型保持一致
- 如果切面方法 没有返回值 ,这块返回什么无所谓的
public class MyAnnoCut implements BasePointCut<MyAnno> {
@Nullable
@Override
public Object invoke(@NonNull ProceedJoinPoint joinPoint, @NonNull MyAnno anno) {
int value1 = (int) joinPoint.args[0];
int value2 = (int) joinPoint.args[1];
int result = value1 * value2;
return result;
}
}
suspend 函数¶
- BasePointCutSuspend 继承自 BasePointCut
- MatchClassMethodSuspend 继承自 MatchClassMethod
Note
对于切点函数是 suspend 函数的,采用上述两种类型更好一些,如果继续使用 BasePointCut
、MatchClassMethod
其返回值必须是 joinPoint.proceed()
的返回值,如需修改返回值请看如下代码:
class MyAnnoCut5 : BasePointCutSuspend<MyAnno5> {
override suspend fun invokeSuspend(joinPoint: ProceedJoinPointSuspend, anno: MyAnno5){
withContext(Dispatchers.IO) {
//通过设置 OnSuspendReturnListener 来修改返回值 onReturn 的返回值就是 suspend 切点函数的返回值
joinPoint.proceed(object : OnSuspendReturnListener {
override fun onReturn(proceedReturn: ProceedReturn): Any? {
return (proceedReturn.proceed() as Int)+100
}
})
}
}
}
Note
此处 onReturn 的解释同此处的返回值是什么