什么是类加载
当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。
而类加载必然涉及类加载器
java语法的角度来看
- 使用new 静态加载
- 调用某个 ClassLoader 实例的 loadClass() 方法
- 调用 Class.forName() 方法
jvm加载类的机制
双亲委派机制
线程上下文加载机制
1 和 3 用 new 和 Class.forName 的方法都是使用 的 this.getClass.getClassLoader
@CallerSensitive
public static Class<?> forName(String className)
throws ClassNotFoundException {
Class<?> caller = Reflection.getCallerClass();
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
使用 classLoader 则是用户指定类加载器
两个异常(exception)
静态加载的时候如果在运行环境中找不到要初始化的类,抛出的是NoClassDefFoundError,它在JAVA的异常体系中是一个Error
动态态加载的时候如果在运行环境中找不到要初始化的类,抛出的是ClassNotFoundException,它在JAVA的异常体系中是一个checked异常
类的加载(类初始化):
1、在java代码中,类型的加载、连接、与初始化过程都是在程序运行期间完成的(类从磁盘加载到内存中经历的三个阶段)【牢牢记在心里】
2、提供了更大的灵活性,增加了更多的可能性
总结: 加载阶段简单来说就是: .class文件(二进制数据)——>读取到内存——>数据放进方法区——>堆中创建对应Class对象——>并提供访问方法区的接口