ClassLoader的动态加载机制

    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到内存中来。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值