类的加载过程
双亲委派机制
- 加载: 就是将我们编译后的.class文件从磁盘加载到内存。更准确的说是应该加载到我们的方法区当中。jdk7之前方法区的实现是永久代,jdk7之后方法区叫元空间。
加载通过类加载器来完成,类加载器有两种,引导类(启动类)加载器(C/C++语言实现),自定义类加载器。将所有派生于ClassLoader的类加载器都划分为自定义类加载器,而引导类加载器(Bootstrap ClassLoader)并没有继承ClassLoader类,用来加载Java核心库中的信息,同时自定义加载器也是有引导类加载器加载。自定义类加载器又分为:Extension Class Loader(扩展类加载器),System Class Loader(AppClassLoader)(系统类加载器),用户自定义加载器。扩展类加载器主要加载ext子目录下的内容。系统类加载器加载程序员自己写的类。其中扩展类加载器为系统类加载器的父加载器,引导类加载器为扩展类加载器的父加载器,这里的父子关系不能理解为Java类的父子继承关系,可以理解为上下级的关系。 最终类的加载是通过那种类型的加载器去执行,有jvm通过双亲委派机制来确定。 - 链接(验证,准备,解析)
- 初始化
如果一个类加载器收到了类加载的请求,它会将加载类的任务委托给父类加载器,如果父类加载器还存在父类加载器,继续向上层委托,直到启动类加载器。如果在这个过程中发现当前加载器可以执行加载任务,而当前类加载器的父加载器无法执行加载任务,那么就确定了加载任务的执行者。
