AOP 技术的总结

作者: 奔跑吧李博 | 来源:发表于2023-01-11 22:50 被阅读0次

AOP是Aspect Oriented Programming的首字母缩写,翻译过来就是面向切面编程。与之对应的是OOP(Object-Oriented Programming),面向对象编程。

Android AOP就是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,提高开发效率。

比如,当多个类要调用同一种方法,可以另外再写一个工具类,但是这样调用也是有耦合性的。而用切面的操作方式就可以解决这样的问题。

从广义上来讲,AOP技术可以是任何能实现代码织入的技术或框架,对代码的改动最终都会体现在字节码上,而这类技术也可以叫做字节码增强,通用名词理解即可。

AOP技术常用在以下方面:

1、日志记录:业务埋点
2、持久化
3、性能监控:性能日志
4、数据校验:方法的参数校验
5、缓存:内存缓存和持久缓存
6、权限检查:业务权限(如登陆,或用户等级)、系统权限(如拍照定位)
7、异常处理

常用AOP实现方式
动态、静态织入

首先,从织入的时机的角度看,可以分为源码阶段、class阶段、dex阶段、运行时织入。对于前三项源码阶段、class阶段、dex织入,由于他们都发生在class加载到虚拟机前,我们统称为静态织入,而在运行阶段发生的改动,我们统称为动态织入。

织入时机 技术框架
静态织入 APT,AspectJ、ASM、Javassit
动态织入 java动态代理,Javassit

静态织入发生在编译器,因此几乎不会对运行时的效率产生影响;动态织入发生在运行期,可直接将字节码写入内存,并通过反射完成类的加载,所以效率相对较低,但更灵活。

  • APT

APT(Annotation Processing Tool)即注解处理器,它用来在编译时扫描和处理注解,扫描过程可使用 auto-service 来简化寻找注解的配置,在处理过程中可生成java文件(创建java文件通常依赖 javapoet 这个库)。常用于生成一些模板代码或运行时依赖的类文件,比如常见的ButterKnife、Dagger、ARouter,它的优点是简单方便。

  • AspectJ

AspectJ是一种严格意义上的AOP技术,因为它提供了完整的面向切面编程的注解,这样让使用者可以在不关心字节码原理的情况下完成代码的织入,因为编写的切面代码就是要织入的实际代码。

  • Javassist

Javassist是可以动态编辑Java字节码的类库。它可以在Java程序运行时定义一个新的类,并加载到JVM中;还可以在JVM加载时修改一个类文件。

  • ASM

ASM可以在编译期直接修改编译出的字节码文件,也可以像Javassit一样,在运行期,类文件加载前,去修改字节码。完整的学习ASM必须了解字节码和JVM相关知识。

示例:
ASM的实际使用场景非常广泛,我们以Matrix为例。
Matrix是微信开源的一个APM框架,其中TraceCanary子模块用于监测帧率低、卡顿、ANR等场景,具备函数耗时统计的功能。
为了实现函数的耗时统计,通常的做法都是在函数执行开始和结束为止进行插桩,最后以两个插桩点的时间差为函数的执行时间。

参考:
https://www.jianshu.com/p/c40528c8df17?utm_source=desktop&utm_medium=timeline
https://www.jianshu.com/p/0acd18d50717

相关文章

网友评论

    本文标题:AOP 技术的总结

    本文链接:https://www.haomeiwen.com/subject/axpiyltx.html