类加载器学习小结
学习渠道:尚硅谷
1.理解类加载器加载对象
- .java文件编译后会生成*.class*文件,那么在.class文件需要运行时,如何将这些物理磁盘等等上的.class文件加载到JVM上呢,此时,类加载器发挥了作用。
- 类加载简要流程 .class --> JVM --> JVM内存中的各种元数据
2.类的加载过程
1. 加载Loading
- 主要做了3个工作:【不只局限本地磁盘系统加载】
- 通过该类全类名获取该类相应的二进制字节流
- 将该字节流存储的内容按照约定规则【许多字节是JVM识别的标识,诸如常量池的起始位置等等】转化为方法区的运行时数据结构
- 内存中生成Java.lang.Class对象,该对象给我们提供了一个访问该对象方法区中各种数据的入口
2. 链接Linking{验证Verification 准备preparation 解析Resoulution}
- 验证Verification
- 保证被加载类的正确性,以至于危害到JVM自身安全
- 准备preparation
- 类变量设置**初始值**
- 用**final** 修饰的 **static变量** 直接**显式**初始化[值即为执行值]
- 实例变量则随着对象一同进入Java堆中
- 解析Resoulution
3. 初始化Initialization
- 我们可以理解为该阶段就是执行<clinit>()方法的过程
- 该方法是javac编译器自动收集所有类变量的赋值动作和静态代码块中的语句【前面初始化,这边赋值】
- 上述操作的顺序是按照语句在源文件中出现的顺序 顺序执行的
- 类的构造器是<init>()方法,二者是具有区别的
- 执行的**原则**还是:**由父及子**
- 类的初始化阶段<clinit>()方法在**多线程情况下是同步加锁的**
- 验证Demo 【】
3.类的加载器分类 (Java核心类是引导类加载器加载的,出于安全考虑,Bootstrap 启动类加载器只加载包名为java/javax/sum 开头的类)
- 引导类加载器 Bootstrap ClassLoader [C C++ 编写,到达获取父加载器时,引导类加载器显示为null]
- 自定义加载器 User-Defined ClassLoader
- 获取类加载器
- 虚拟机自带的加载器 扩展类加载器
- 用户自定义类加载器
在自定义类加载器中,我们可以对.class进行解密操作(加密是为了防止反编译) - 实现步骤
- 获取ClassLoader的途径
4.双亲委派机制 【由父及子】
- 系统类加载器加载jdbc.jar
5.双亲委派机制优势
1.避免类的重复加载
2.保护程序安全,防止核心api被篡改
6.沙箱安全机制介绍
- 在jvm中判断两个class对象是否为同一个类存在两个必要条件