标签:增加 安全 注解 tac 动态代理 打印 nal 等等 ace
AOP是指在jvm运行时, 动态将代码切入到指定位置.
OOP是一个维度上写代码, AOP是把他切开来, 变成立体的.
这样的好处是: 业务逻辑跟辅助逻辑分离,
例如日志打印, 性能监控, 安全控制等等, 代码不会搞的很冗余.
跟filter的区别有什么区别呢, 看上去filter也可以做上述事情,
有请求才会filter, filter也无法更细粒度的控制.
如何切开程序? 答: 通过修改字节码.
之前设计器那边用过AspectJ来实现静态的修改class切入, 这种其实不算动态修改.
因为他是编译过程中植入代码的. 例如对设计器中所有的mouse点击事件进行记录,
来回溯设计器制作模板的过程.
还有一种是通过asm框架动态的切入class.
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上的注解来判断是否需要植入代码.
标签:增加 安全 注解 tac 动态代理 打印 nal 等等 ace
原文地址:http://www.cnblogs.com/xdecode/p/7905626.html