假设有一个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