ClassLoader的动态加载机制。
一、原则:
1、Java中的ClassLoader并非一次加载,而是在需要的时候才会加载。
2、static语句块在加载后只会执行一次。
3、dynamic语句块每次new新的对象都会执行。
* 执行在static语句块之后,构造函数之前
* 等同于构造方法中的语句
* 用的较少
4、java -verbose:class参数可以观察类的具体加载过程。
二、下面我们首先来看一段代码。
package initialization;
/**
* 请使用-verbose:class参数查看加载顺序
*/
class A{
public A(int i){
System.out.println("A("+i+")");
}
}
class C{
static A a1 = new A(1);
public C(){
System.out.println("C()");
}
static{
System.out.println("类C的static块");
}
{
System.out.println("类C的动态语句块--此方法会无条件的加在每个构造函数之前");
}
}
class D{
public D(){
System.out.println("D()的构造函数");
}
}
public class TestDynanicLoadingV2 {
public static void main(String[] args){
System.out.println("main()--begin");
new A(2);
System.out.println("main()--middle");
new C();
new D();
}
}
三、可以在eclipse中,右键该文件,使用Run As-->Open Run Dialog,然后在Arguments标签页中的VM arguments中输入“-verbose:class”参数来执行该类,结果如下:
[Loaded initialization.TestDynanicLoadingV2 from file:/D:/workspace/java/TestReflection/bin/]
main()--begin
[Loaded initialization.A from file:/D:/workspace/java/TestReflection/bin/]
A(2)
main()--middle
[Loaded initialization.C from file:/D:/workspace/java/TestReflection/bin/]
A(1)
类C的static块
类C的动态语句块--此方法会无条件的加在每个构造函数之前
C()
[Loaded initialization.D from file:/D:/workspace/java/TestReflection/bin/]
D()的构造函数
四、分析
从上面的代码运行结果可以看出,ClassLoader在加载类时,是一行一行的加载,只有在需要时,它才会把相关的类load到内存中来。