Android AOP

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jielundewode/article/details/80168872

面向切面编程好处不用多说,看一下android实现吧。
翻来翻去找到一个不错的库,库地址

1.使用

在项目根目录的build.gradle里添加依赖:

classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.0'

接下来,在app项目的build.gradle里应用插件:

apply plugin: 'android-aspectjx'

一般切面会新建一个库,这里为了简单就在原有项目里进行操作,需要添加AspectJ依赖:

implementation 'org.aspectj:aspectjrt:1.8.+'

配置要注意的地方(摘录自作者的github):
AspectJX配置
AspectJX默认会处理所有的二进制代码文件和库,为了提升编译效率及规避部分第三方库出现的编译兼容性问题,AspectJX提供include,exclude命令来过滤需要处理的文件及排除某些文件(包括class文件及jar文件)。

注意:2.0.0版本之后旧版本的includeJarFilter和excludeJarFilter命令废弃,不再支持使用

2.0.0版本的 include,exclude通过package路径匹配class文件及jar文件,不再支持通过jar物理文件路径匹配的方式,比如:

支持

aspectjx {
//排除所有package路径中包含android.support的class文件及库(jar文件)
exclude ‘android.support’
}
不支持

aspectjx {
excludeJarFilter ‘universal-image-loader’
}

//或者
aspectjx {
exclude ‘universal-image-loader’
}
支持和*匹配

aspectjx {
//忽略所有的class文件及jar文件,相当于AspectJX不生效
exclude ‘*’
}
提供enabled 开关

enabled默认为true,即默认AspectJX生效

aspectjx {
//关闭AspectJX功能
enabled false
}
至此,配置完成。

2.简单使用

这里假设需要为所有的OnClick事件添加一个toast,即执行onclick时,先弹一个toast:

import org.aspectj.lang.annotation.After
import org.aspectj.lang.annotation.Around
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.reflect.MethodSignature

@Aspect
open class CheckOnClickAspectJ {
    @Around("execution( * android.view.View.OnClickListener.onClick(..))")
    @Throws(Throwable::class)
    open fun checkClick(joinPoint: ProceedingJoinPoint) {
        var signature = joinPoint.signature as MethodSignature
        var view = joinPoint.args[0] as View
        var context: Any = joinPoint.`this`
        //如果有任何检测的不符合条件 返回null即可不执行方法
        ALog.e("开始执行click:${context.javaClass.name}")
        ALog.e("开始执行click2:${view.context}")
        CommonUtils.showToast(view.context as Activity, "你点击了")

        joinPoint.proceed()
    }

代码说明:
1.注意别导错包;
2.注意类需要添加@Aspect声明
3.ProceedingJoinPoint类方法自己看一下即可,里面的方法都很重要,根据需要使用
4.除了@Around,还有@After和@Before,看名字就知道啥意思,不再赘述

猜你喜欢

转载自blog.csdn.net/jielundewode/article/details/80168872