AOP
AOP是指在jvm运行时, 动态将代码切入到指定位置.
OOP是一个维度上写代码, AOP是把他切开来, 变成立体的.
这样的好处是: 业务逻辑跟辅助逻辑分离,
例如日志打印, 性能监控, 安全控制等等, 代码不会搞的很冗余.
跟filter的区别有什么区别呢, 看上去filter也可以做上述事情,
有请求才会filter, filter也无法更细粒度的控制.
如何切开程序? 答: 通过修改字节码.
之前设计器那边用过AspectJ来实现静态的修改class切入, 这种其实不算动态修改.
因为他是编译过程中植入代码的. 例如对设计器中所有的mouse点击事件进行记录,
来回溯设计器制作模板的过程.
还有一种是通过asm框架动态的切入class.
ASM
asm是字节码框架, 可以动态增删改类的方法等属性.
字节码上一层是asm, asm上一层是cglib, 再上一层是应用层.
可以通过asm直接修改class, 也可以用javaassist来修改.
前者速度更快, 但是需要一点汇编命令, 后者是封装好的api.
实际使用场景
1, 插件的加载中, 在class加载之前增加一些方法.
2, 有一种破解方式就是运行过程中把他的字节码打印出来, 然后再反编译看class.
3, 比如想要修改某个jar里的class, 反编译出来可能错误多多, 可以通过javaassist来直接修改class.
4, javap查看字节码, 更深入的了解一段代码是如何执行的, 从哪个栈出来, 放到哪个栈里.
5, 之前介绍过的BTrace Greys等工具, 他们是attach到jvm上, 通过agent来加载脚本, 通过asm修改class.
产品中的运用
动态代理的两种方式, cglib和java原生的区别与优劣.
cglib不需要对象有接口, 他是用继承, 因此类不能是final的.
而java动态代理是通过接口的方式, 因为类需要有接口实现.
1.7里测试java动态代理更快.
如何使用上述两种
通过xml配置或者注解.
比如xml中指定某一个类, 某一个方法作为切入点.
或者扫描class method上的注解来判断是否需要植入代码.