Kotlin版Aspect入门篇
介绍:
AspectJ是一个面向切面编程的一个框架,它扩展了java语言,并定义了实现AOP的语法。在将.java文件编译为.class文件时默认使用javac编译工具,AspectJ会有一套符合java字节码编码规范的编译工具来替代javac,在将.java文件编译为.class文件时,会动态的插入一些代码来做到对某一类特定东西的统一处理。通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的技术。对业务逻辑的各个部分进行隔离,耦合度降低,提高程序的可重用性,同时提高了开发的效率。
OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分,而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。
AOP编程的主要用途有:日志记录,行为统计,安全控制,事务处理,异常处理,系统统一的认证、权限管理等。
AspectJ的配置很麻烦,这里使用 AspectJX 框架,框架地址:https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx
首先,先来点软柿子捏捏,体验一把什么叫切面编程,比较常用的埋点统计,在我们需要自己去实现埋点统计的时候,很多人是不是写个埋点工具类,然后在每个入口的地方去添加埋点的方法,如果埋点较多会感觉很烦,如果用AspectJ怎么去实现呢,抛开业务逻辑,一切从简
首先添加依赖



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

然后就开始编写我们的AspectUtils类了,这个类需要用 @Aspect 声明为标记类

然后在标识类下面写切面方法

这些是什么意思呢,此处需要一段注释
/**
@Pointcut("execution(" +//执行语句
"@com.kotlinstrong.utils.aspect.MyAnnotationOnclick" +//注解筛选
"*" + //类路径,*为任意路径
"*" + //方法名,*为任意方法名
"(..)" +//方法参数,'..'为任意个任意类型参数
")" +
" && " +//并集
) @Aspect:声明切面,标记类
@Pointcut(切点表达式):定义切点,标记方法
@Before(切点表达式):前置通知,切点之前执行
@Around(切点表达式):环绕通知,切点前后执行
@After(切点表达式):后置通知,切点之后执行
@AfterReturning(切点表达式):返回通知,切点方法返回结果之后执行
@AfterThrowing(切点表达式):异常通知,切点抛出异常时执行
* */
可以看到,我们写的测试方法是test开头的,before是在方法执行前切入,在onCreate里面调用方法,在运行程序后,打印出方法名称

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

在工具类里面需要加一个方法,从上面的注释可以看到,需要返回值的,用 @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项目地址
https://github.com/1024477951/KotlinStrong
Kotlin版Aspect入门篇的更多相关文章
- Unity3D大风暴之入门篇(海量教学视频版)
智画互动开发团队 编 ISBN 978-7-121-22242-9 2014年2月出版 定价:79.00元 328页 16开 编辑推荐 长达800分钟的高清教学视频,手把手教会初学者 数个开发案例 ...
- Android Studio2.0 教程从入门到精通Windows版 - 入门篇
http://www.open-open.com/lib/view/open1468121363300.html 本文转自:深度开源(open-open.com)原文标题:Android Studio ...
- 《Unity3D大风暴之入门篇(海量教学视频版)》
<Unity3D大风暴之入门篇(海量教学视频版)> 基本信息 作者: 智画互动开发团队 出版社:电子工业出版社 ISBN:9787121222429 上架时间:2014-1-13 出版日期 ...
- 学习版pytest内核测试平台开发万字长文入门篇
前言 2021年,测试平台如雨后春笋般冒了出来,我就是其中一员,写了一款pytest内核测试平台,在公司落地.分享出来后,有同学觉得挺不错,希望能开源,本着"公司代码不要传到网上去,以免引起 ...
- spring boot(一):入门篇
构建微服务:Spring boot 入门篇 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...
- 1. web前端开发分享-css,js入门篇
关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...
- 【three.js详解之一】入门篇
[three.js详解之一]入门篇 开场白 webGL可以让我们在canvas上实现3D效果.而three.js是一款webGL框架,由于其易用性被广泛应用.如果你要学习webGL,抛弃那些复杂的 ...
- Swift入门篇-Hello World
提示:如果您使用手机和平板电脑看到这篇文章,您请在WIFI的环境下阅读,里面有很多图片, 会浪费很多流量. 博主语文一直都不好(如有什么错别字,请您在下评论)望您谅解,没有上过什么学的 最近这2天主要 ...
- web前端开发分享-css,js入门篇(转)
转自:http://www.cnblogs.com/jikey/p/3600308.html 关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人 ...
随机推荐
- 纯CSS与HTML实现垂直时间轴
原创YouTube HTML源码 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- luogu P5596 【XR-4】题
题目背景 xht37 喜欢分块,以至于对一道不需要分块的题也要分块做. 题目描述 有一个长度为 nn 的序列,xht37 现在想分块维护它. PinkRabbit 要求他只准将序列分成 PRPR 种长 ...
- 初次接触tensorflow
要确保已经明白神经网络和卷积神经网络的原理.如果不明白,先学习参考资料1.tensorflow中有很多api,可以分成2大类.1类是比较低层的api(tf.train),叫TensorFlow Cor ...
- vue2.5 + element UI el-table 导出Excel
安装依赖 npm install --save xlsx file-saver 新建excelHelper.js \src\utils\目录下新建excelHelper.js文件 import Vue ...
- Mint UI 之loadmore组件的坑:内部元素头部被遮挡了一部分
前端经常会遇到数据分页加载的需求,mint-ui组件为大家提供了loadmore组件 但是我在使用的时候,遇到了一个问题:写好布局和样式以及逻辑之后,我的mt-loadmore标签的头部总是不顶在父元 ...
- kubernetes-集群构建
本实验参考:https://github.com/gjmzj/kubeasz kubernetes官方github地址 https://github.com/kubernetes/kubernetes ...
- 2019年Java并发精选面试题,哪些你还不会?(含答案和思维导图)
Java 并发编程 1.并发编程三要素? 2.实现可见性的方法有哪些? 3.多线程的价值? 4.创建线程的有哪些方式? 5.创建线程的三种方式的对比? 6.线程的状态流转图 7.Java 线程具有五中 ...
- native C++ 动态调用.NET DLL
关于这个问题找了好多地方,都只有第二种解决办法,可是我要返回一个字符串,没办法,继续找,最后还是在http://blogs.msdn.com/b/msdnforum/archive/2010/07/0 ...
- 在Atmel Studio7中创建ASF项目
使用ASF自带例程的方式创建程序是很方便,但是因为系统例程支持的ATMEL开发板往往和用户板配置不同,所以我们需要自己创建项目.下面介绍在AS7.0中快速创建一个ASF项目的方法. 1.首先从菜单开始 ...
- ELK输出nginx的日志(未完成)
我们先准备3台centos7服务器 171 做 elasticsearch,kibana的操作 172 做logstash 的操作 173 做nginx 的操作 软件 版本号 elasticsearc ...