-
Notifications
You must be signed in to change notification settings - Fork 18
切点方法返回值
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 是不同的,因为我们往往在切面处理类设置一些成员变量,方便在下次切面处理时的使用。简单来说,切面处理类的对象和类或类的对象是绑定在一块的,它的生命周期略长于切点非静态方法的类的对象。