- 自定义加载器在写类库或者框架的时候是必用的,tomcat有自己的类加载器、spring也有自己的classloader
- 通过自定义类加载器可以加载自己在指定目录下的class文件
- 不同的类加载器主要是负责不同路径下class文件的加载
- 懒加载:有好多个class文件时可以将他们放到一个栈中,然后一个个去load,但是一般不会这样做;在java中一般是需要采取加载,叫懒加载—->细致、繁琐的内容
- load栈,找到栈,load里面的class,会load炸???
- 本地代码—->windows是exe,linux是elf,c语言编译完的东西叫
- 类加载的过程:加载-验证-准备-解析-初始化-使用-销毁
- 在初始化的过程中会执行静态代码块!
- getSystemClassLoader()得到的就是应用类加载器!!!—->此处的系统指的是应用程序—->类路径
- getSystemClassLoader()得到的是系统默认的ClassLoader
- getSystemClassLoader()拿到系统默认的ClassLoader,有关于安全,里面自己定义了一些关于安全的检查,我们一般用不到,需要的时候直接调用这个方法拿到直接用即可
加载
验证
准备
- 真正写程序的时候不会这么写,一般会在构造方法中赋值,或者用静态语句块赋值
- 编程习惯问题—->要养成良好的编程习惯
- 这么写会被老大怼
- 一般都先赋成默认值,然后用静态语句块依次赋值就行了
- 类加载(类装载)分成两个过程:preparation和initialization
- new对象也分为两步:1、给对象申请内存,给其中的成员变量先赋默认值;2、调用构造方法,给他赋值成为初始值
- 与类加载过程中静态变量的变化过程类似
- 一般成员变量和构造方法谁写前面,谁就先执行,正常是这样,假如之间没有依赖关系的话会也产生乱序
指令重排序问题
- 双重校验锁DCL
- 需要给INSTANCE加volatile,因为这样可以避免指令重排序造成错误地获取到了半初始化状态
解析
- 将符号引用转换为直接引用
- 很多时候需要进行动态绑定,有些必须是动态绑定—->只有new出来,运行起来,才知道具体位置
- 面试中,这部分问到的更多的是多态