(转)Java-AOP(Hook)实现机制(JDK/cglib动态代理/ASM/Javassist/AspectJ)
原文: http://www.iteye.com/topic/1116696
1 AOP各种的实现
AOP就是面向切面编程,我们可以从几个层面来实现AOP。 AOP实现时有三种方式:生成子类字节码、生成代理类字节码、直接修改原类的字节码
在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较。
类别 | 机制 | 原理 | 优点 | 缺点 |
静态AOP | 静态织入 | 在编译期,切面直接以字节码的形式编译到目标字节码文件中。 | 对系统无性能影响。 | 灵活性不够。 |
动态AOP | 动态代理 | 在运行期,目标类加载后,为接口动态生成代理类,将切面植入到代理类中。 | 相对于静态AOP更加灵活。 | 切入的关注点需要实现接口。对系统有一点性能影响。 |
动态字节码生成 | 在运行期,目标类加载后,动态构建字节码文件生成目标类的子类,将切面逻辑加入到子类中。 | 没有接口也可以织入。 | 扩展类的实例方法为final时,则无法进行织入。 | |
自定义类加载器 | 在运行期,目标加载前,将切面逻辑加到目标字节码里。 | 可以对绝大部分类进行织入。 | 代码中如果使用了其他类加载器,则这些类将不会被织入。 | |
字节码转换 | 在运行期,所有类加载器加载字节码前,前进行拦截。 | 可以对所有类进行织入。 |
|
2 AOP里的公民
- Joinpoint:拦截点,如某个业务方法。
- Pointcut:Joinpoint的表达式,表示拦截哪些方法。一个Pointcut对应多个Joinpoint。
- Advice: 要切入的逻辑。
- Before Advice 在方法前切入。
- After Advice 在方法后切入,抛出异常时也会切入。
- After Returning Advice 在方法返回后切入,抛出异常则不会切入。
- After Throwing Advice 在方法抛出异常时切入。
- Around Advice 在方法执行前后切入,可以中断或忽略原有流程的执行。
- 公民之间的关系
织入器通过在切面中定义pointcut来搜索目标(被代理类)的JoinPoint(切入点),然后把要切入的逻辑(Advice)织入到目标对象里,生成代理类。
CSDN博客:http://blog.csdn.net/qq_32115439/article/details/78361596