简述
此文是对 第6讲 | 动态代理是基于什么原理? 的学习
一些知识点/笔记点:
- 动态类型与静态类型语言
- 语言类型信息是在运行时检查,还是编译期检查。
- 强类型和弱类型,就是不同类型变量赋值时,是否需要显式地(强制)进行类型转换。
- Java 是静态的强类型语言,但是因为提供了类似反射等机制,也具备了部分动态类型语言的能力。
- ==Java 反射机制==,是动态代理的一种
- 通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。
- AOP 使用到了动态代理
- 实现动态代理有很多方式,Java 反射是一种,利用传说中更高性能的字节码操作机制,类似 ASM、cglib(基于 ASM)、Javassist 等。
- 反射机制内容及基本编程场景:Class、Field、Method、Constructor 等,这些完全就是我们去操作类和对象的元数据对应。
- 反射提供的 AccessibleObject.setAccessible(boolean flag)。它的子类也大都重写了这个方法,这里的所谓 accessible 可以理解成修饰成员的 public、protected、private,这意味着我们可以在运行时修改成员访问限制!
- 代理机制:代理模式,代理可以看作是对调用目标的一个包装,对目标代码的调用不是直接发生的,而是通过代理完成。
- 代理实现解耦,不关注内部细节。
- 静态代理发展到动态代理
- Spring AOP 支持两种模式的动态代理,JDK Proxy 或者 cglib,cglib 方式对接口的依赖被克服了。
- JDK Proxy 和 cglib 优势对比
JDK Proxy 的优势:
最小化依赖关系,减少依赖意味着简化开发和维护,JDK 本身的支持,可能比 cglib 更加可靠。
平滑进行 JDK 版本升级,而字节码类库通常需要进行更新以保证在新版 Java 上能够使用。
代码实现简单。
基于类似 cglib 框架的优势:
有的时候调用目标可能不便实现额外接口,从某种角度看,限定调用者实现接口是有些侵入性的实践,类似 cglib 动态代理就没有这种限制。
只操作我们关心的类,而不必为其他相关类增加工作量。
高性能。
- AOP 的目的和能力,简单来说它可以看作是对 OOP 的一个补充,因为 OOP 对于跨越不同对象或类的分散、纠缠逻辑表现力不够,比如在不同模块的特定阶段做一些事情,类似日志、用户鉴权、全局性异常处理、性能监控,甚至事务处理等。
Java 源码的学习
可以参照之前的一篇文章:Java源码学习
网友评论