Android AOP方案(一)——AspectJ - 掘金AOP是一个概念,并没有设定具体语言的实现,它能克服那些只有单继承特性语言的缺点(如Java),AOP具体实现有很多种方式,AspectJ 只是其中一种。 AspectJ通过注解的形式来标注切入点、切入对象等,然后在代码编译期间将代码织入到java的字节码中。 该注解用来标注一…https://juejin.cn/post/6888548726424469511

Android切面编程主要是使用 AspectJ 只是其中的一种类型,事实上 AspectJ 是通过注解的形式来标注切入点,切入对象等,然后在代码编译期间将代码织入到 java字节码中, 从而实现切面编程意义。

AOP是一个概念,并没有设定具体语言的实现,它能克服那些只有单继承特性语言的缺点(如Java),AOP具体实现有很多种方式,AspectJ 只是其中一种。
AspectJ通过注解的形式来标注切入点、切入对象等,然后在代码编译期间将代码织入到java的字节码中。

Android使用 AspectJ 的步骤

1: AspectJ 注解

@Aspect

该注解用来标注一个类,标明当前类是切面类,以便AspectJ能够识别。如:

@Aspect
public class FragmentAspectJInjector {}

@Pointcut

标注一个方法,用来定义切点,参数为切点表达式。如定义一个切点是在Fragment的onResume生命周期方法执行的时候:

@Pointcut("execution(* android.app.Fragment+.onResume(..))")
public void fragmentOnResumePointcut() {
}

@Around,@Before,@After

标注一个方法,定义具体织入的代码,参数为切点表达式。 这里可以使用“&&、||、!”来组合不同的Pointcut定义。如我们在Fragment的onResume生命周期前打印下当前的Fragment对象:

@Around("fragmentOnResumePointcut()")
public void fragmentOnResume(final ProceedingJoinPoint joinPoint) throws Throwable {Object target = joinPoint.getTarget();Log.e(TAG, "fragmentOnResume: fragment = " + target);joinPoint.proceed();
}

AspectJ 注解还有很多,如@AfterReturning@AfterThrowing等,这里不再一一列举,大家有兴趣可以查看官方文档。上述这些注解基本已经可以满足我们的需求了。

第1步:新建一个Android project

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><FrameLayoutandroid:id="@+id/fragment"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);getFragmentManager().beginTransaction().replace(R.id.fragment, new BlankFragment()).commit();}
}

第2步:添加AspectJX依赖

根据AspectJX的github文档,我们在项目根目录的build.gradle里添加依赖

buildscript {repositories {google()jcenter()}dependencies {classpath 'com.android.tools.build:gradle:4.2.0-alpha07'classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.8'}
}

在APP module中的build.gradle里应用插件

apply plugin: 'android-aspectjx'

第3步:添加切面类

@Aspect
public class FragmentAspectJInjector {private static final String TAG = "FragmentAspectJInjector";@Pointcut("execution(* android.app.Fragment+.onResume(..))")public void fragmentOnResumePointcut() {}@Around("fragmentOnResumePointcut()")public void fragmentOnResume(final ProceedingJoinPoint joinPoint) throws Throwable {Object target = joinPoint.getTarget();Log.e(TAG, "fragmentOnResume: fragment = " + target);joinPoint.proceed();}

第4步:构建并运行APP

通过logcat窗口可以看到如下输出:可以看到我们的切点已经织入成功了。

E/FragmentAspectJInjector: fragmentOnResume: fragment = BlankFragment{8fafb1e #1 id=0x7f0800a4}\

AspectJ 缺点

  • 如果相应的class没有实现相应的切点方法将无法织入,如上文中的没有BlankFragment实现onResume方法的话,将无法织入代码。
  • 无法处理Lambda语法
  • 会有一系列兼容性问题,如R8、gradle版本不同等
  • 性能较差,APP项目比较大时编译时间明显加长。

AOP系列:切面编程框架 : AspectJ相关推荐

  1. 【SSM】Spring系列——AOP面向切面编程

    文章目录 03 AOP面向切面编程 3.1 AOP概述 3.2 面向切面编程对有什么好处 3.3 模拟AOP框架实现 3.3.1 代码实现版本一 3.3.2 代码实现版本二 3.3.3 代码实现版本三 ...

  2. 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析

    文章目录 一.查看使用 AspectJ 后生成的 Class 字节码类 二.AspectJ 的本质 一.查看使用 AspectJ 后生成的 Class 字节码类 在 Android Studio 中查 ...

  3. 【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )

    文章目录 一.AspectJ 下载 二.拷贝 aspectjrt.jar 到 Android Studio 三.配置 Gradle 和 Gradle 插件版本 四.配置 Gradle 构建脚本 一.A ...

  4. 【AOP 面向切面编程】AOP 简介 ( AspectJ 简介 | AspectJ 下载 )

    文章目录 一.AOP 简介 二.AspectJ 简介 三.AspectJ 下载 一.AOP 简介 AOP 是 Aspect Oriented Programming 的缩写 , 面向切面编程 ; 利用 ...

  5. 大数据WEB阶段Spring框架 AOP面向切面编程(一)

    Spring - AOP面向切面编程(一) 一.代理模式概述 代理的特点:(目标对象即被代理者) 实现和目标对象相同的接口 具备和目标对象的方法 代理者不仅要做目标对象的方法 , 还要做一些额外的操作 ...

  6. 大数据WEB阶段Spring框架 AOP面向切面编程(二)

    Spring AOP面向切面编程(二) 一.切入点的execution表达式 execution的表达形式: execution(修饰符? 返回值类型 所在包类? 方法名(参数列表) 异常?) ?表示 ...

  7. spring中AOP(面向切面编程)

    spring中AOP(面向切面编程) 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是spring框架中的一个重要内容 ...

  8. AOP面向切面编程之全局日志打印/统计接口耗时

    目录 一.什么是AOP 二.AOP使用场景 三.使用AOP的好处 四.先举个例子理解AOP面向切面编程 五.Spring5.X的AOP切入点表达式有这些种写法 六.实战基于Spring的AOP快速实现 ...

  9. java aop面向切面编程

    最近一直在学java的spring boot,一直没有弄明白aop面向切面编程是什么意思.看到一篇文章写得很清楚,终于弄明白了,原来跟python的装饰器一样的效果.http://www.cnblog ...

  10. 切面是异步还是同步操作‘_Autofac的AOP面向切面编程研究

    什么是AOP: 我的理解是 把系统性的编程工作封装起来 =>我给这个取个名字叫 "Aspect",然后通过AOP技术把它切进我们的业务逻辑代码 => "业务& ...

最新文章

  1. SAP S/4 HANA与SAP Business Suite/R3(ECC)的区别
  2. 在IIS中使用Gzip压缩后传送数据
  3. Android 6.0权限问题
  4. python 列表、元组、集合、字典、循环遍历数据结构
  5. 信息学奥赛C++语言:百钱买百鸡
  6. eclipse占用内存过大_Java内存泄漏分析工具Memory Analyzer Tool
  7. 用计算机参加关于动漫的工作计划,动漫社团年度工作计划
  8. 获取页面元素的滚动位置,兼容各浏览器
  9. canvas 从入门到入坟
  10. matlab虚拟现实之建立simulink虚拟现实工具箱的使用
  11. C#的排序算法以及随机产生不重复数字的几个Demo
  12. greenplum定期清理日志脚本-分割线后更新简单方法
  13. 谷歌云盘Colab使用心得
  14. 英雄联盟数据分析专题(二)
  15. Window10设置图标名、文件名的字体大小方法
  16. 计算机没有管理无线网络,笔记本win7系统下没有无线网络选项的解决方法
  17. O(nlogn)级排序之希尔排序
  18. 第一篇 重新认识皮肤
  19. 20 Rest高级客户端实践(六):搜索入门和基本API介绍
  20. Python那么火,想送些资料给你

热门文章

  1. linux怎么查看bgp状态,在CentOS中制作BGP路由的教程
  2. requires erlang = R16B-03
  3. 还在纠结哪个配音软件好用?推荐几款实用的有声配音软件给你
  4. 1 仓储管理系统 仓库端快速上手
  5. Linux磁盘/硬盘测速,dd命令,测试顺序读写,测试4K性能
  6. SpringBoot jap使用原生Sql的几种姿势
  7. 时间戳转日期格式 +new Date
  8. 什么是长尾关键词567
  9. 藏文驾考科目一科目四理论题库
  10. dronekit 控制飞控 上/下/前/后/左/右 或是 上/下/东/西/南/北