java加载分析_分析Java类加载全过程

今天去涉猎了一下类的加载的过程,现在也总结一下:

一个java文件从被加载到被卸载这个生命过程,总共要经历4个阶段:

加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载

其中加载(除了自定义加载)+链接的过程是完全由jvm负责的,什么时候要对类进行初始化工作(加载+链接在此之前已经完成了),jvm有严格的规定(四种情况):

1、遇到new,getstatic,putstatic,invokestatic这4条字节码指令时,加入类还没进行初始化,则马上对其进行初始化工作。其实就是3种情况:用new实例化一个类时、读取或者设置类的静态字段时(不包括被final修饰的静态字段,因为他们已经被塞进常量池了)、以及执行静态方法的时候。

2、使用java.lang.reflect.*的方法对类进行反射调用的时候,如果类还没有进行过初始化,马上对其进行。

3、初始化一个类的时候,如果他的父亲还没有被初始化,则先去初始化其父亲。

4、当jvm启动时,用户需要指定一个要执行的主类(包含static void main(String[] args)的那个类),则jvm会先去初始化这个类。

以上4种预处理称为对一个类进行主动的引用,其余的其他情况,称为被动引用,都不会触发类的初始化。下面也举了些被动引用的例子:

/**

* 被动引用情景1

* 通过子类引用父类的静态字段,不会导致子类的初始化

* @author volador

*

*/

classSuperClass{

static{

System.out.println("super class init.");

}

publicstaticintvalue=123;

}

classSubClassextendsSuperClass{

static{

System.out.println("sub class init.");

}

}

publicclasstest{

publicstaticvoidmain(String[]args){

System.out.println(SubClass.value);

}

}

输出结果是:super class init。

/**

* 被动引用情景2

* 通过数组引用来引用类,不会触发此类的初始化

* @author volador

*

*/

publicclasstest{

publicstaticvoidmain(String[] args){

SuperClass s_list=newSuperClass[10];

}

}

输出结果:没输出

41/41234>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值