zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Year Outline stat Detail stat 1987--1996----1999 C:UsersATIDocuments00drmmr v2 tafdrmmr1987-20
    atitit 2010 2010 diary log events memorabilia v3 taf .docx No finish , wait to finish 1.6 yLu
    Atitit 标记语言ML(Markup Language) v4 目录 1. 标记语言ML Markup Language 1 1.1. 简介 1 2. 置标语言置标语言通常可以分为三类:标识性的
    Atitit 2001drmmr v1 t05.docx 1.1shoeho kh majyao n chfe ,bg n rjywel ycyi ,shwa leihaivvei yaopao
    Atitit nlp重要节点 v3 目录 1. 语法分析重点 节点余额365个 1 2. nlp词性表 2 2.1. 词语分类13类 2 2.2. 副词 约20个 3 2.3. 代词30个 3 2
    Atitit 提升语法级别4gl 4.5g 4.9g 5g 目录 1. 语言级别表 1 2. 4.9g实现细节 2 2.1. $dollor前导符 2 2.2. Static变量 2 2.3. S
    Atitit 工程师程序员技术级别对应表与主要特征 P1--p6 说明 类别 职称 对应技术标志 P5 高级工程师 工程师类 一般四五年 P6 资深开发 工程师类 78年经历 P7 P7
    Atitit 自然语言与人工语言的语法构建ast的异同点 目录 1. 语言节点gaishu。。 2 1.1. 节点、函数数量大约200个 2 1.2. 关键词节点 是 有 的 3 1.3. 标识符
    Atitit 编程语言的block概念 目录 1. 匿名block 1 1.1. 函数块 方法快 1 1.2. Sp udf块 1 2. 实现block的方式 1 2.1. 早期的语言大多是采用en
    Atitit 效率提升法细则 v3 t028.docx Atitit 提升效率细则 目录 1. 目标 2 1.1. 配置化增加扩展性 尽可能消除编译 方便增加 调整业务逻辑 2 1.2. 统一接口
  • 原文地址:https://www.cnblogs.com/LiuZhen/p/11851590.html
Copyright © 2011-2022 走看看