类加载器用于将class文件加载到JVM中去执行。下面介绍类加载器涉及到的基本概念和加载基本过程。
一、Java虚拟机与程序的生命周期
在运行Java程序时,会启动JVM进程,该进程中会使用一个线程去执行我们的Java程序。在如下几种情况下,Java虚拟机将结束生命周期:
1.执行了System.exit(0)(内部调用了Runtime.getRuntime().exit(n)),如果是非0参数表示异常退出。
2.程序正常结束
3.程序在执行过程中遇到了异常或错误而导致异常终止。如果异常没有try-catch而一直throw,那么一直throw到main方法,
main方法还不处理的化那就会throw给JVM,JVM看到异常就会结束运行。
4.由于操作系统错误而导致的Java虚拟机进程终止
二、类的加载、连接与初始化
加载:查找并加载类的二进制数据到JVM
连接:分为三个步骤
Ø 验证:确保被加载类的正确性
Ø 准备:为类的静态变量分配内存,并将其初始化为默认值
Ø 解析:把类中的符号引用转换为直接引用
初始化:为类的静态变量赋予正确的初始值。(就是在类中定义变量时赋予的默认值)
以上的过程中并不会初始化对象变量,因为此时并不存在任何对象,只是将类的class文件数据加载到内存中,对象的生成是在该过程完成之后。
类中的静态代码块是按照声明的顺序执行的,例如:
static int a;
static {
a=1;
}
static{
a=2;
}
此时a的最终值是2,如果两个代码块颠倒顺序,那么a的最终值就是1。
三、类的主动使用与被动使用
Java程序中对类的使用可以分为两种:主动使用 和 被动使用。
1.Java程序对类的主动使用的情况
> 创建类的实例
> 访问某个类或接口的静态变量,或者对该静态变量赋值
> 调用类的静态方法
> 通过反射访问类,例如Class.forName(“package.ClassName”)
> 初始化一个类的子类,或访问子类的静态变量或静态方法也是对父类的主动使用。
> Java虚拟机启动时被标注为启动类的类,例如JUnit中的TestCase类。
所有的Java虚拟机实现必须在每个类或接口被Java程序首次主动使用时才初始化它们。因此Java虚拟机只有在一个类第一次
发生上面的六种情况时才会初始化该类,仅第一次主动使用时初始化。
除了以上的主动使用的情况,其它的情况都是对类的被动使用,因此都不会导致类的初始化。