AOP为Aspect Oriented Programming的缩写,意为:面向切面编程 简单的理解就是可以对某些方法进行拦截,二次加工.
比较火的开源库是: https://mvnrepository.com/artifact/org.aspectj/aspectjweaver/1.9.6
Android 项目,如果觉得直接使用麻烦的话,可以使用开源库 https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx
一、集成环境到 Android Studio 1.在项目的 build.gradle 添加 classpath classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10' 2.在对应 module(app) 的 build.gradle 顶部添加插件 apply plugin: 'android-aspectjx' 在运行的那个 app 的 module 里添加就够了,其他的module 如过没报错可以不添加
二、编写测试代码 我在最开始的时候,一直以为项目没有集成进去,其实是我代码写错了, 所以,简单的测试代码显的特别重要。
package org.itzheng.aop;
import android.util.Log;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class TestAop {
@Before("execution(* on*(..))")
public void testBefore() {
Log.w("aop", "TestAop testBefore: ");
}
}
运行App,输出 很多? W/aop: TestAop testBefore: W/aop: TestAop testBefore:
说明环境安装没问题.
三、拦截器介绍 @Before:这种拦截器先执行拦截代码,再执行目标代码。如果拦截器抛异常,那么目标代码就不执行了; @After:这种拦截器先执行目标代码,再执行拦截器代码。无论目标代码是否抛异常,拦截器代码都会执行; @AfterReturning:和@After不同的是,只有当目标代码正常返回时,才执行拦截器代码; @AfterThrowing:和@After不同的是,只有当目标代码抛出了异常时,才执行拦截器代码; @Around:能完全控制目标代码是否执行,并可以在执行前后、抛异常后执行任意拦截代码,可以说是包含了上面所有功能。
四、表达式介绍(参考:@Pointcut注解表达式介绍_XWForever的专栏-CSDN博客) 官网:Core Technologies 1.execution 最基本的表达式 ? ? ? ? 语法:execution([@注解全名]?[访问修饰符] 返回类型 [包类.方法名称(方法参数)] [异常]) ? ? ? ? [] 代表可选参数 ? ? ? ? 如:execution(public void *.on*(..)) ? ? ? ? ? ? execution(@注解名 * *(..))
2.@annotation?用于匹配方法上拥有指定注解的情况 ? ? ? ? 如:@annotation(time) ? ? ? ? 在拦截方法上需要传入 参数名为 time 的注解
@Around("@annotation(time)")
public Object joinPoint(ProceedingJoinPoint joinPoint,ExecTime time) throws Throwable{}
3.within?用来指定类型的,指定类型中的所有方法将被拦截。 ????????如:within(org.itzheng.aop..*) 当前包下所有类 ? ? ? ? ? ??within(org.itzheng.aop.ACD) ACD类
更多表达式可以查看参考网页
五、通配符 * 任意一个 .. 多个 比如:
返回类型为任意类型: *
某个包下的所有类,不包括子包:a.b.c.*
某个包下的所有类,的所有方法,不包括子包:a.b.c.*.*(..)
某个包下的所有类,包括子包:a.b.c..*
某个包下的所有类,的所有方法,包括子包:a.b.c..*.*(..)
以on开头的无参方法: on*()
以on开头的不限参数方法:on*(..)
六、多条件组合 Pointcut 可以将某个条件定义到一个方法上,然后通过多个方法组合 表达式:&&? ?||? ?! 如:
//定义:
@Pointcut("execution(* *())")
private void pointcut1()
@Pointcut("execution(* *())")
private void pointcut2()
//使用符合条件1但是不符合条件2的所有方法
@Around("pointcut1() && !pointcut2()")
public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {}
七、更多条件示例 ?
|