Skip to content

切点方法返回值

FlyJingFish edited this page May 15, 2024 · 9 revisions

简述

对于 @AndroidAopPointCut 和 @AndroidAopMatchClassMethod 这两种切面都有其切面回调处理类分别是

  • @AndroidAopPointCut 对应 BasePointCut
interface BasePointCut<T : Annotation> {
    fun invoke(joinPoint: ProceedJoinPoint, anno: T): Any?
}
  • @AndroidAopMatchClassMethod 对应 MatchClassMethod
interface MatchClassMethod {
    fun invoke(joinPoint: ProceedJoinPoint, methodName:String): Any?
}

可以看到 两个 invoke 方法都有一个返回值,这个返回值将会替换掉切入点方法的返回值,并且会自动转化为原方法的返回类型

返回值是什么

  • 如果切面方法有返回值invoke 的返回值就是切面方法返回值
  • 另外如果切面方法有返回值invoke 的返回值类型要和切面方法返回类型保持一致
  • 如果切面方法没有返回值,这块返回什么无所谓的
@MyAnno
public int numberAdd(int value1,int value2){
    int result = value1+value2;
    return result;
}
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;
    }
}

例如上边 numberAdd 方法 return 是两个参数相加,进入切面后,我就想改成两个数相乘,所以返回值是什么呢?相信你已经知道了

匹配切面和注解切面的切面处理类的生命周期是怎样的?

切面处理类与类的对应方法绑定在一起,分为两种情况

  • a、如果切点方法 不是静态的
    • 切面处理类会随着方法所在对象的回收而回收,但这不是及时的;回收时机是其他任意一个切面处理时才进行回收。
    • 并且每一个对象的切点方法各自对应一个切面处理类的对象,也就是说一个切点方法的所在类创建了多少个对象,就有多少个切面处理类对象。
  • b、如果切点方法 是静态的
    • 切面方法因为是静态的,所以切面处理类一旦被创建会一直存在。
    • 并且一个类方法只对应一个切面处理类

不管是a、b哪种类型,切面处理类对象只有在方法被执行时才会被创建出来。

这与 Aspectj 是不同的,因为我们往往在切面处理类设置一些成员变量,方便在下次切面处理时的使用。简单来说,切面处理类的对象和类或类的对象是绑定在一块的,它的生命周期略长于切点非静态方法的类的对象。