1、类加载时机
- 创建类的实例(Student stu=new Student())
- 调用类的类方法 (Math.abs(-10))
- 访问类或者接口的类变量,或者为该类变量赋值(Integer.MAX_VALUE)
- 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
- 初始化某个类的子类( Dog extends Animal | Dog dog= new Dog())
- 直接使用java.exe命令来运行某个主类,用到就把类的.class文件内容读到内存中,不用就不读
2、类加载过程
加载
- 通过包名 + 类名,获取这个类的二进制字节流
- 将这个类的二进制字节流读到内存中
- 在内存中生成一个代表这个类的 java.lang.Class 对象(重要)
验证
确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全
(文件中的信息是否符合虚拟机规范有没有安全隐患)
准备
负责为类的类变量(被static修饰的变量)分配内存,并设置默认初始化值(初始化静态变量) 去掉static
解析
将类的二进制数据流中的符号引用替换为直接引用(本类中如果用到了其他类,此时就需要找到对应的类)
初始化
开始执行类中定义的 Java 程序代码,初始化类变量和其他资源
3、类加载器的分类
- BootstrapClassLoader:启动类加载器
- PlatformClassLoader:平台类加载器 继承 Bootstrap
- SystemClassLoader:系统类加载器 继承 Platform
ClassLoader 中的两个方法
方法名 | 说明 |
public static ClassLoader getSystemClassLoader() | 获取系统类加载器 |
public InputStream getResourceAsStream(String name) | 加载某一个资源文件 |