概念
类的class文件中包含了类的所有信息。
jvm将描述类的数据从class文件中加载到内存,并对数据进行校验,解析和初始化,生成可以被jvm直接使用的java类型。
类加载时机
加载
链接(跟加载并行) 包括验证,准备,解析
初始化
使用
卸载
类加载过程-加载
通过类的全限定名获取此类的二进制流
加载源(文件 eg:class文件,jar文件;网络;计算生成 eg:动态代理生成接口的实例)
将字节流中的静态数据结构转化成运行时方法区中的动态数据结构
在内存中生成一个这个类的Class对象,作为这个类的各种数据的访问入口
类加载过程-验证
- 保证class文件符合规范
- 文件格式 cafebaby,版本号等
- 元数据 语义校验,比如是否有父类,是否继承了final修饰的类等
- 字节码校验
- 符号引用校验
类加载过程-准备
- 类变量赋初始值。 Int 0;double 0.0; 应用 null ; 在方法区中
- 类常量赋指定值。
类加载过程-解析
- 将常量池中的符号引用转为直接引用
类加载过程-初始化
触发初始化:
- 遇到new,getstatic,putstatic (使用类的静态变量),invokestatic(调用类的静态方法)的字节码命令的时候,会初始化
- 反射
- 初始化子类之前一定会先初始化父类
- 程序入口main的类
不会初始化: ( 211页 3段demo)
- 通过子类引用父类的静态变量,子类不会被初始化 Child.filed 不会初始化Child,其中filed是父类的静态变量
- 使用类的常量,不会初始化类(常量在编译的时候已经放入了方法区)
- 数组引用类 Student[] stus=new Student[10]; 不会初始化Student类