静态代理
场景:某一物体移动方法前需要不同的描述:例如日志、时间、特殊事件、权限等的单一或多个的不同组合。
可以用继承,但是会需要多个代理类重复的拼接不同的描述,且高耦合。
可以代理类中聚合物体类,虽说耦合降低,但是拼接还是不行。
最终可以使代理类与物体类同实现接口,接口类聚合在代理类中(类似装饰模式)。
使:前后表述行为与物体,同时实现代理接口,实现被代理物体(如:坦克)的行为的前后处理,可以是代理类成链的被代理。
动态代理
jdk
java.lang.reflect
Proxy.newProxyInstance(对应类加载器,实现接口,执行处理类-实现);
自动生成代理类,并机继承代理父类,实现接口,调用第三个参数的invoke()
生成代理类是用到了asm类库(动态语言java核心),直接修改二进制代码
instrument(琴弦):class加载内存前被它拦截,直接修改二进制码(更强大更繁琐需要知道class01含义)
gclib
不需要实现接口
简单,继承被代理类,所以final被定义的类,不可被cglib代理
责任链可以完成多个代理类代理
https://blog.csdn.net/ahilll/article/details/82943836
底层也是asm
springAOP
bean工厂+**灵活装配,动态拼接,**成就java框架一哥地位
底层实现有两种方式:一种是JDK动态代理,另一种是CGLib的方式。
所以最底层也是asm