12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- 类加载器
- 类的加载过程:
- Java文件--->Class文件(字节码文件)--->虚拟机进行解释
- 加载类的时机:
- 1、创建类的对象
- 2、调用类的类方法
- 3、访问类或接口的类变量或为类变量赋值
- 4、使用反射方式来强制创建某个类或接口的Class对象
- 5、初始化某个类的子类
- 6、直接使用java.exe命令来运行某个类
- 其实就是只要实用了这个类或这个类的成员或者这类的子类,这时候就会加载这个类到虚拟机
- 类的加载过程:
- 1、通过一个类的全限定名(包名.类名)获取定义这个类的二进制字节流。
- 2、把这个字节流的静态存储结构转换为运行时数据结构
- 3、在内存中生成一个代表这个类的java.lang.Class对象,任何类在被使用的时候,系统都会创建他的java.lang.Class对象
- 类的加载过程:
- 1、加载
- |-通过包名.类名,找到这个类,并且准备使用流进行传输
- |-就是把这个类加载到内存中,当加载完毕之后,就会创建一个Class对象
- 2、链接
- |-1、验证
- 验证阶段是链接阶段的第一步
- 保证Class文件的字节流中包含的信息能够符合当前虚拟机的需求
- 检查文件中的信息是不是符合虚拟机的规范,有没有安全隐患
- |-2、准备
- 负责将类的类变量(static修饰的)分配内存,并且设置默认的初始化值。
- |-3、解析
- 把类的二进制数据流中的符号引用替换为直接引用。
- 如果当前类中引用了其他类,这个时候就需要找到对应的类。
- 3、初始化
- 根据我们通过程序指定的主管计划进行初始化类变量和其他的资源,
- 比如进行静态变量赋值,或者进行其他的初始化资源
- 类的加载过程:
- 1、把Student.java文件编译成Student.class文件字节码文件
- 2、拿到了字节码文件后,开始进入到【加载】阶段,通过包名.类名获取这个类。
- 并且把这个类加载到内存中。加载完成后创建一个Class对象。
- 3、进入【链接】阶段,链接阶段主要做3件事:验证、准备、初始化。
- 验证:检查一下
- 准备:提前把需要加载的类的静态变量这种先加载,并初始化默认值。
- 解析:把符号引用替换为直接引用。
- 4、进入到【初始化】阶段:完成初始化工作,比如对静态变量进行赋值
- 类的加载器分类:
- BootstrapClassLoader:Java虚拟机内置的类加载器,一般表示为null,并且没有父null。
- PlatformClassLoader:平台类加载器,负责加载JDK中的一些特殊的模块
- SystemClassLoader:系统类加载器,负责加载用户的类路径上指定的类库。
- 继承关系:
- SystemClassLoader的父加载器是PlatformClassLoader,
- PlatformClassLoader的父加载器是BootstrapClassLoader
- 双亲委派模型
- 如果一个类加载器收到了类加载请求,它绝不会自己先去加载,而是把这个请求委托给父类的加载器去执行。
- 如果父类的加载器还存在父类加载器,就会再次向上委托,依次递归,直到请求最终到达最顶层的启动类加载器。
- 如果父类加载器可以完成类加载任务,就成功返回。如果父类加载器不能完成任务,子类加载器才会尝试自己加载,
- 这就是双亲委派模式。
|