2.19 AOP

1 minute read

2.13.1 AspectJ

  1. Join Points(程序中的关键函数或代码段) | Join Points | 说明 | | —————– | ——– | | method call | 函数调用, 调用的地方 | | method execution | 函数执行, 某个函数内部 | | constructor call | 构造函数 | | constructor execution | 构造函数执行 | | field get | 获取某个变量 | | field set | 设置某个变量 | | static initialization | 类初始化 | | handler | 异常处理 | | advice execution | | | pre-initialization | Object在构造函数中做的工作 | | initialization | Object在构造函数中的工作 |

  2. Pointcuts(类似处理多个Join Points)

    • 例子与Pointcuts详解
  // 1. pointcut为关键词, 定义pointcut
  // 2. testAll为pointcut的名, 定义pointcut可分为指定名或匿名
  // 3. call为选择条件, 即Join Points类型为call类型
  // 4. public  *  *.println(..)使用通配符, public为目标函数的访问标识(public/private/protected); 第一个*号表示返回值, 即返回所有类型; 第二个*指定包名, 此处不限定包名; println即函数名, 完整通配符的意思是任意包下定义的println函数
  public pointcut  testAll(): call(public  *  *.println(..)) && !within(TestAspect) ;
  1. Join Points和Pointcut的映射表 | Join Points category | Pointcut syntax | | ————————– | ——————– | | method call | call(MethodSignature) | | method execution | execution(MethodSignature) | | constructor call | call(ConstructorSignature) | | constructor execution | execution(ConstructorSignature) | | field get | get(FieldSignature) | | field set | set(FieldSignature) | | static initialization | staticinitialization(TypeSignature) | | handler | handler(TypeSignature) | | advice execution | adviceexecution() | | pre-initialization | preinitialization(ConstructorSignature) | | initialization | initialization(ConstructorSignature) |

  2. advice(AspectJ的hook机制) | advice关键字 | 说明 | | —————– | ——– | | before() | before advice, Join Point执行前运行 | | after() | after advice, Join Point执行后运行 | | after:returning(返回值类型), after:throwing(异常类型) | 指定Join Point返回类型(returning/throwing), 不指定则默认包含两种(即after) | | around() | before和after指Join Point执行前或执行后触发, around替换原Join Point, 如果要执行原Join Point需要调用proceed |

  • 例子参考(图片来自深入理解Android之AOP)

来自深入理解Android之AOP

AOP实现方式

  1. APT(Annotation Processing Tool), 定义编译期注解, 继承AbstractProcessor, 生成代码逻辑

  2. AspectJ, 参考上文

  3. Javassist, 编译期修改class文件, 类似ASM, 但api比较友好

参考

Tags:

Categories:

Updated: