假设有一个class,ClassLoader首先把它load到内存里的code segment(内存里存放代码段的),站在ClassLoader的角度,内存里的一个一个的class就是一个一个的对象,这个对象就是xx.class,实际就是Class类的对象。Load完class,找到main函数开始执行,然后会把很多其他的类Load进来,动态加载机制。

 

测试动态加载机制:

新建项目Reflection,new一个class,TestDynamicLoading:

public class TestDynamicLoading {
    public static void main(String[] args) {
        
        new A();
        
        System.out.println("*****-------------------------******");
        
        new B();
        
        new C();
        new C();
        
        new D();
        new D();
        
    }

}
class A{
    
}

class B{
    
}
class C{
    //static语句块,只调用一次。
    static{
        System.out.println("CCCCCCCCCCCCCCCCCCCCCCCCCCCC");
    }
    
}
class D{
    //动态语句块,每次new出来对象时被调用一次。用的不多。
    {
        System.out.println("DDDDDDDDDDDDDDDD");
    }
}

右键,Run As-----> Run  Configurations。

Program arguments:程序命令行参数

VM arguments:虚拟机的参数,java程序运行的时候java命令行上给你指定的虚拟机参数

-verbose:class  :详细的输出。

---> Run

可以看到控制台的输出,程序的执行步骤是:

1,先加载  class  A,

2,再执行 System.out.println("*****-------------------------******");

3,加载 class  B,

4,加载 class  C,而且static语句块只执行了一次。

5,加载class  D ,动态语句块执行了2次。

java的动态加载机制就是如此,被验证。

[Loaded A from file:/D:/Eclipse/gongzuokongjian/Reflection/bin/]
*****-------------------------******
[Loaded B from file:/D:/Eclipse/gongzuokongjian/Reflection/bin/]
[Loaded C from file:/D:/Eclipse/gongzuokongjian/Reflection/bin/]
CCCCCCCCCCCCCCCCCCCCCCCCCCCC
[Loaded D from file:/D:/Eclipse/gongzuokongjian/Reflection/bin/]
DDDDDDDDDDDDDDDD
DDDDDDDDDDDDDDDD

 

 欢迎关注个人公众号一起交流学习: