面向切面编程好处不用多说,看一下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,看名字就知道啥意思,不再赘述

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Adroid studio3.2 JNI教程
  6. 2019-02-25(android)
  7. Android(安卓)WebView使用本地字体
  8. 去除svn中方法
  9. 网页中android Toast效果的实现

随机推荐

  1. 通过类名获取对象集合
  2. 回调 + 闭包 插值和模板字面量的应用
  3. Js002-四种函数
  4. andorid 如何构建autofill service和Auto
  5. 在项目中引用android.support.v7
  6. android 修改默认APN
  7. Android(安卓)OpenCV(零):OpenCV Android(安
  8. Android(安卓)对话框(Dialog)大全 建立你
  9. Activity中的四种启动模式
  10. Rexsee API介绍:Android屏幕锁定,Keyguard