- ①加载,根据类的全限定类名找到相应的字节码文件也就是编译生成的.class文件并读入内存中。
- 然后生成一个java.lang.Class的类,这个类就是要加载的类。
- ②验证,文件格式校验、字节码校验、元数据校验、符号校验等,以保证生成的类符合jvm规范。
- ③ 准备,这个阶段会给静态变量分配内存,赋默认初始值,给final的变量赋值。
- ④ 解析,将符号引用解析成直接引用,包括方法解析、接口解析等。
- ⑤ 初始化,给类的成员变量赋值。
触发jvm加载类的时机之一就是调用class.forname,
还有调用一个类的静态变量或者静态方法,还有new,还有jvm启动时指定的类,这些都会出发jvm去加载一个类。
类的加载机制遵循 :
- ① 全盘委托,一个类的和他依赖和引用的类都由一个加载器加载
- ②双亲委托,加载一个类时总是由父类先去加载,找不到再由子类加载。自底向上检查,自顶向下加载。
- ③缓存机制,所有加载过的类都会被缓存起来,加载一个类时先到缓存里找,如果没有再去加载class文件。所以在修改class后需要重启jvm
类的加载器包括三种:
- BootstrapClassLoader(启动类加载器) 负责加载核心java类;
–可以使用Launcher.getBootstrapClassPath().getURLs()
获取类加载器加载路径。 - ExtensionClassLoader(扩展类加载器),负责加载lib/ext下的扩展类;
- ApplicationClassLoade(应用程序类加载器)负责加载classpath下的类。