Kotlin版Aspect入门篇

介绍:

  AspectJ是一个面向切面编程的一个框架,它扩展了java语言,并定义了实现AOP的语法。在将.java文件编译为.class文件时默认使用javac编译工具,AspectJ会有一套符合java字节码编码规范的编译工具来替代javac,在将.java文件编译为.class文件时,会动态的插入一些代码来作到对某一类特定东西的统一处理。经过预编译方式和运行期动态代理实如今不修改源代码的状况下给程序动态统一添加功能的技术。对业务逻辑的各个部分进行隔离,耦合度下降,提升程序的可重用性,同时提升了开发的效率。java

  OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以得到更加清晰高效的逻辑单元划分,而AOP则是针对业务处理过程当中的切面进行提取,它所面对的是处理过程当中的某个步骤或阶段,以得到逻辑过程当中各部分之间低耦合性的隔离效果。
  AOP编程的主要用途有:日志记录,行为统计,安全控制,事务处理,异常处理,系通通一的认证、权限管理等。
  AspectJ的配置很麻烦,这里使用 AspectJX 框架,框架地址:https://github.com/HujiangTechnology/gradle_plugin_android_aspectjxandroid

首先,先来点软柿子捏捏,体验一把什么叫切面编程,比较经常使用的埋点统计,在咱们须要本身去实现埋点统计的时候,不少人是否是写个埋点工具类,而后在每一个入口的地方去添加埋点的方法,若是埋点较多会感受很烦,若是用AspectJ怎么去实现呢,抛开业务逻辑,一切从简git

首先添加依赖

 

 

 


接着定义一个测试方法,testAspect,这个方法就是触发点,只要我调用了这个方法,就统计一下

 

 

 而后就开始编写咱们的AspectUtils类了,这个类须要用  @Aspect 声明为标记类github

 

 

 而后在标识类下面写切面方法编程

 

 

 这些是什么意思呢,此处须要一段注释安全

/**
@Pointcut("execution(" +//执行语句
"@com.kotlinstrong.utils.aspect.MyAnnotationOnclick" +//注解筛选
"*" + //类路径,*为任意路径
"*" + //方法名,*为任意方法名
"(..)" +//方法参数,'..'为任意个任意类型参数
")" +
" && " +//并集
)

@Aspect:声明切面,标记类
@Pointcut(切点表达式):定义切点,标记方法
@Before(切点表达式):前置通知,切点以前执行
@Around(切点表达式):环绕通知,切点先后执行
@After(切点表达式):后置通知,切点以后执行
@AfterReturning(切点表达式):返回通知,切点方法返回结果以后执行
@AfterThrowing(切点表达式):异常通知,切点抛出异常时执行
* */
能够看到,咱们写的测试方法是test开头的,before是在方法执行前切入,在onCreate里面调用方法,在运行程序后,打印出方法名称

 

 

 是否是很敢单,可是假如我要根据方法的返回值来添加逻辑定义埋点呢?肿木办,不要慌,这都不是事,再写一个测试方法,返回一个数值app

 

 在工具类里面须要加一个方法,从上面的注释能够看到,须要返回值的,用 @AfterReturning,看图说话框架

 

 在注解的后面定义了一个返回参数id,这里要注意,注解上的returning标注的参数名称要跟下面申明的参数名称一致函数

而后仍是同样的打印出信息,运行一下看看工具

 

 打印出1,完美,这样埋点是否是方便多了,只要在你须要执行的方法出匹配就能自动切入埋点,自成一类,是否是感受很兴奋,原来如此简单,可是没结束,上面讲到了埋点,还能有什么比较常规的

操做吗。

确定有的,根据方法名称匹配切入有时候可能会修改方法名什么的,在一些场合确定也不合适,这里能够自定义注解去解决,恰好咱们平时跳转页面会作一个比较频繁的操做,防抖,这里来实现一个防抖效果,加载一个列表,添加item点击事件,点击后跳转详情页,若是你快速点击,会进入屡次,这显然不是咱们想要的效果,那么咱们能够自定义一个注解,而后在跳转的方法上添加注解,在切面类编写防抖触发,点击间隔设置为1000毫秒

/* 防抖点击 */
/**
* SOURCE:运行时 不存储在编译后的 Class 文件。
* BINARY:加载时 存储在编译后的 Class 文件,可是反射不可见。
* RUNTIME:编译时 存储在编译后的 Class 文件,反射可见。
*/
@Retention(AnnotationRetention.RUNTIME)
/**
* CLASS:类,接口或对象,注解类也包括在内。
* ANNOTATION_CLASS:只有注解类。
* TYPE_PARAMETER:Generic type parameter (unsupported yet)通用类型参数(还不支持)。
* PROPERTY:属性。
* FIELD:字段,包括属性的支持字段。
* LOCAL_VARIABLE:局部变量。
* VALUE_PARAMETER:函数或构造函数的值参数。
* CONSTRUCTOR:仅构造函数(主函数或者第二函数)。
* FUNCTION:方法(不包括构造函数)。
* PROPERTY_GETTER:只有属性的 getter。
* PROPERTY_SETTER:只有属性的 setter。
* TYPE:类型使用。
* EXPRESSION:任何表达式。
* FILE:文件。
* TYPEALIAS:@SinceKotlin("1.1") 类型别名,Kotlin1.1已可用。
*/
@Target(AnnotationTarget.FUNCTION)
annotation class MyAnnotationOnclick(
/** 点击间隔时间 */
val value: Long = 1000
)
这里一个注解类就完成了,而后在编写一个测试方法,在方法里去跳转一个页面,而后在你的点击事件里调用这个跳转方法

 

 接下来到咱们的切面类去定义一个切点

 

 这里识别注解标识的方法,告诉代码注入工具,在何处注入一段特定带条件的代码的表达式,此处的条件就是咱们定义的注解,而后在编写咱们的切入方法

 

 此处获匹配到注解方法,而后调用了一个ClickUtils类去作防抖操做

 

 运行你的程序发现,快速点击的时候只会触发一次了,只须要在你操做的跳转方法里添加一个注解就能够达到防抖效果,nice,扶我起来,我还能学

说到切面编程就不得不说登陆了,通常app就是两种方式,先登陆在进入,先进入,在检查让你登陆,那么若是是先进入浏览,而后在检测让用户登陆是否是也须要在多个地方去判断呢,这里是否是也同样,能够用Aspect去作呢,拿起键盘就是一顿ctrl+c

仍是同样的套路,首先定义一个注解

 

 而后我须要在打开详情页的时候去检测,若是没有登陆的话就直接跳转到登陆页面去

 

 在到工具类里写切面表达式跟方法,这里用最简单的方式来实现效果,真的登陆确定不会这么简单

 

 运行后,点击详情,会发现打开了一个详情后再次打开了一个登陆页面,这里复用也是很方便

不行了,学不动了,赶忙掐人中

Aspects不是万能的,可是有了它能够对咱们的开发带来极大的方便,这里附上Kotlin项目地址,喜欢的请star

https://github.com/1024477951/KotlinStrong

相关文章
相关标签/搜索