本文共 933 字,大约阅读时间需要 3 分钟。
当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。
而类加载必然涉及类加载器
双亲委派机制
线程上下文加载机制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对象——>并提供访问方法区的接口
转载地址:http://efyzi.baihongyu.com/