目录
一、类加载过程一览
加载:
验证:
准备:
解析:
初始化:
二:类加载器分类
启动类加载器(bootstrap class loader)
扩展类加载器(extensions class loader)
应用程序类加载器(application class loader)
自定义类加载器
三:类加载器的代理模式
双亲委派模型
一、类加载过程一览
加载:
将硬盘上的Java二进制文件(class文件)转为内存中的Class对象
验证:
确保加载入内存的class文件没有问题
准备:
正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。注意此时的设置初始值为默认值,具体赋值在初始化阶段完成
解析:
虚拟机常量池内的符号引用替换为直接引用(地址引用)的过程。
初始化:
执行类变量(静态变量)的赋值动作和静态语句块(按定义的顺序从上往下执行)
1、父类的静态变量
2、父类的静态代码块
3、子类的静态变量
4、子类的静态代码块
5、父类的非静态变量
6、父类的非静态代码块
7、父类的构造方法
8、子类的非静态变量
9、子类的非静态代码块
10、子类的构造方法
二:类加载器分类
启动类加载器(bootstrap class loader)
(1)它用来加载 Java 的核心库(JAVA_HOME/jre/lib/rt.jar,sun.boot.class.path路径下的内容),是用原生代码(C语言)来实现的,并不继承自 java.lang.ClassLoader。
(2)加载扩展类和应用程序类加载器。并指定他们的父类加载器。
扩展类加载器(extensions class loader)
(1)用来加载 Java 的扩展库(JAVA_HOME/jre/ext/*.jar,或java.ext.dirs路径下的内容) 。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java类。
(2)由sun.misc.Launcher$ExtClassLoader实现。
应用程序类加载器(application class loader)
(1)它根据 Java 应用的类路径(classpath,java.class.path 路径下的内容)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。
(2)由sun.misc.Launcher$AppClassLoader实现。
自定义类加载器
(1)开发人员可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器,以满足一些特殊的需求。
三:类加载器的代理模式
双亲委派模型
它是首先尝试去加载某个类,如果找不到再代理给父类加载器