Java 类加载时机(动态静态) 与 类加载过程 详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 类加载时机(动态静态) 与 类加载过程 详解相关的知识,希望对你有一定的参考价值。

(目录)


类加载

动态加载 和 静态加载

反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载


类加载时机


静态加载:

用户可能输入1,也可能输入2,Dog类不一定会用到,静态加载不管那么多,它在编译的时候就会加载这个类,并且进行语法的校验

静态加载的依赖性较强


动态加载


类加载过程

加载和连接是JVM来完成的,我们无法控制,而初始化阶段就是我们自己可控的了(比如你在静态代码里面写什么内容是你自己可以控制的)


  • 连接阶段-验证

连接阶段-准备

//类加载的连接阶段——准备
public class ClassLoad02 
    public static void main(String[] args) 
        //...
    


class A 
    //属性(成员变量,字段)
    //分析类加载的连接阶段——准备,属性是如何处理:
    //1. n1是成员变量,不是静态变量,因此在准备阶段,不会分配内存
    //2. n2是静态变量,分配内存,n2是默认初始化0,而不是20
    //3. n3是static final常量,和静态变量不一样,因为一旦赋值就不变,n3 = 30
    public int n1 = 10;
    public static int n2 = 20;
    public static final int n3 = 30;


连接阶段-解析


Initialization(初始化)

//类加载初始化阶段
public class ClassLoad03 
    public static void main(String[] args) throws Exception 
        //1.加载B类,并生成对应的Class类对象
        //2.连接 num = 0;
        //3.初始化阶段:依次自动收集类中的所有静态变量的赋值动作和静态代码块中的语句,并合并
        /*
            clinit()
                System.out.println("B 静态代码块被执行");
                //num = 300;
                num = 100;
            
            合并:num = 100;
         */

        //new B(); //类加载
        //System.out.println(B.num); //100,如果直接使用类的静态属性,也会导致类的加载

        //加载类的时候,是有同步机制控制
        /*
            protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException 
                //正因为有这个机制,才能保证某个类在内存中,只有一个 Class 对象
                synchronized (getClassLoadingLock(name)) 
                    //...
                
            
         */
        B b = new B();
    


class B 
    static 
        System.out.println("B 静态代码块被执行");
        num = 300;
    

    static int num = 100;

    public B() 
        System.out.println("B 构造器被执行");
    



以上是关于Java 类加载时机(动态静态) 与 类加载过程 详解的主要内容,如果未能解决你的问题,请参考以下文章

JVM类加载机制概述:加载时机与加载过程

java类加载时机与过程

JVM类生命周期概述:加载时机与加载过程

(转)JVM类生命周期概述:加载时机与加载过程

java中类加载时机

java中类加载时机