参考资料 https://blog.csdn.net/nthack5730/article/details/45604031
理论
可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。
——百度百科
Aspectj
AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
——百度百科
Aspectj在Android上的使用
配置
使用开源项目https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx
在根目录下的build.gradle加上
在app上的build.gradle最顶部加上
使用
先看一些代码
声明
其中@Aspect代表声明AspectJ文件,让编译器自动去解析识别。
具体插入方式(Advice)
参数 | 说明 |
---|---|
@Before | 插入点运行之前 |
@After | 插入点运行之前 |
@Around | 插入点运行前后 (不能与@Before@After共用)其中@Around的 proceedingJoinPoint.proceed();代表执行原始的方法可以在前后插入代码 |
@AfterThrowing | 捕获抛出的异常 |
@AfterReturning | 获取方法返回值 |
切入点(Join Points)
注意:途中的testAOP为被切入的方法
参数 | 说明 |
---|---|
execution | 方法内部切入![]() |
call | 方法外部切入![]() |
staticinitialization | 静态代码块切入 |
handler | 捕获异常的切入 |
set/get | 写读属性的切入 |
常用识别标识(Signature)
类型 | 参数 | 说明 |
---|---|---|
一般类型 | ![]() |
* 为不指定 参数顺序为: 修饰符 返回值.类名.方法(参数) |
注解 | @完整路径 | 例如:@cczhr.com.aoptest.DebugTool (..) |
构造方法 | 修饰符 返回值.类名.new(参数) | 例如:cczhr.com.aoptest.Demo.new(..) |
属性 | 修饰符 返回值.类名.成员变量名 | 例如:int cczhr.com.aoptest.Demo.age |
异常 | 类名 | 例如:java.lang.Exception |
其中参数中