2.19 AOP
2.13.1 AspectJ
-
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在构造函数中的工作 |
-
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) ;
-
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) |
-
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)
AOP实现方式
-
APT(Annotation Processing Tool), 定义编译期注解, 继承
AbstractProcessor
, 生成代码逻辑 -
AspectJ, 参考上文
-
Javassist, 编译期修改class文件, 类似ASM, 但api比较友好