首页 > JVM > JVM加载class文件的过程

JVM加载class文件的过程

作者:bin

加载class的过程是:装载、链接、初始化

java类在以下场景一定会被加载:
1、遇到new、get static、put static、invoke static时如果当前类没有被初始化,则先除法初始化
2、使用反射java.lang.reflect包方法进行反射调用时,会进行初始化
3、初始化一个类时,如果父类没初始化,父类也会被初始化
4、虚拟机启动时,用户指定一个主类,即包含main方法的那个类,会被初始化

关联知识:双亲委派模型
———一图读懂:

我们用如下类做测试:

import java.lang.*;
public class test {
    /**
     *  clinit是class类构造器对静态变量,静态代码块进行初始化
     *  其中静态代码块 和 静态变量,加载的顺序是根据编码顺序来的
     */

    static {
        System.out.println("clinit()执行,准备阶段为静态变量赋予了初始值:" 
                + test.staticVariable + ",同时验证了执行顺序");
    }

    /**
     * <clinit执行> 静态变量
     */
    static String staticVariable = "静态变量"; // <clinit>

    /**
     * <clinit执行> 静态代码块
     */
    static {
        System.out.println("clinit()执行,静态代码块:"
                + staticVariable);
    }


    /**
     * <init执行> 非静态代码块
     */
    {
        System.out.println("init()执行,初始化是为:" 
                + this.simpleVariable + ",同时验证了执行顺序");
    }

    /**
     * init是instance实例构造器,对非静态变量解析初始化
     */
    /**
     * <init执行> 非静态变量
     */
    private String simpleVariable = "非静态变量";

    /**
     * <init执行> 非静态代码块
     */
    {
        System.out.println("init()执行,非静态代码块:"
                + simpleVariable );
    }

    /**
     * <init执行> 构造方法
     */
    test(){
        System.out.println("init()执行,构造方法:"
                + simpleVariable);
    }

    public static void main(String[] args) {
        test t = new test();
    }
}

输出:

clinit()执行,准备阶段为静态变量赋予了初始值:null,同时验证了执行顺序
clinit()执行,静态代码块:静态变量
init()执行,初始化时为:null,同时验证了执行顺序
init()执行,非静态代码块:非静态变量
init()执行,构造方法:非静态变量

您必须 [ 登录 ] 才能发表留言!