Android(安卓)AOP
面向切面编程好处不用多说,看一下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.Afterimport org.aspectj.lang.annotation.Aroundimport org.aspectj.lang.annotation.Aspectimport org.aspectj.lang.reflect.MethodSignature@Aspectopen 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,看名字就知道啥意思,不再赘述
更多相关文章
- 一款常用的 Squid 日志分析工具
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- Adroid studio3.2 JNI教程
- 2019-02-25(android)
- Android(安卓)WebView使用本地字体
- 去除svn中方法
- 网页中android Toast效果的实现