1. 自定义加载器在写类库或者框架的时候是必用的,tomcat有自己的类加载器、spring也有自己的classloader
  2. 通过自定义类加载器可以加载自己在指定目录下的class文件
  3. 不同的类加载器主要是负责不同路径下class文件的加载
  4. 懒加载:有好多个class文件时可以将他们放到一个栈中,然后一个个去load,但是一般不会这样做;在java中一般是需要采取加载,叫懒加载—->细致、繁琐的内容
  5. load栈,找到栈,load里面的class,会load炸???
  6. 本地代码—->windows是exe,linux是elf,c语言编译完的东西叫
  7. 类加载的过程:加载-验证-准备-解析-初始化-使用-销毁
  8. 在初始化的过程中会执行静态代码块!
  9. getSystemClassLoader()得到的就是应用类加载器!!!—->此处的系统指的是应用程序—->类路径
  10. getSystemClassLoader()得到的是系统默认的ClassLoader
  11. getSystemClassLoader()拿到系统默认的ClassLoader,有关于安全,里面自己定义了一些关于安全的检查,我们一般用不到,需要的时候直接调用这个方法拿到直接用即可

加载

验证

准备

image.png

  • 真正写程序的时候不会这么写,一般会在构造方法中赋值,或者用静态语句块赋值
  • 编程习惯问题—->要养成良好的编程习惯
  • 这么写会被老大怼
  • 一般都先赋成默认值,然后用静态语句块依次赋值就行了
  • 类加载(类装载)分成两个过程:preparation和initialization

  • new对象也分为两步:1、给对象申请内存,给其中的成员变量先赋默认值;2、调用构造方法,给他赋值成为初始值
  • 与类加载过程中静态变量的变化过程类似
  • 一般成员变量和构造方法谁写前面,谁就先执行,正常是这样,假如之间没有依赖关系的话会也产生乱序

指令重排序问题

  • 双重校验锁DCL
  • 需要给INSTANCE加volatile,因为这样可以避免指令重排序造成错误地获取到了半初始化状态

解析

  1. 将符号引用转换为直接引用
  2. 很多时候需要进行动态绑定,有些必须是动态绑定—->只有new出来,运行起来,才知道具体位置
  3. 面试中,这部分问到的更多的是多态

初始化