- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
分析Java类加载全过程
2012-11-06 10:19 OSCHINA?字号: HYPERLINK javascript:setfont(12); \t _self T?|? HYPERLINK javascript:setfont(16); \t _self T
一个Java文件从被加载到被卸载这个生命过程,总共要经历4个阶段,那么是哪4个阶段呢?下面作者将详细的给网友解答……
AD: HYPERLINK /2015operation/ \t _blank WOT2015 互联网运维与开发者大会 热销抢票
今天去涉猎了一下类的加载的过程,现在也总结一下:
一个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 ?
?* ?
?*/?
class?SuperClass{ ?
????static{ ?
????????System.out.println(super?class?init.); ?
????} ?
????public?static?int?value=123; ?
} ?
?
class?SubClass?extends?SuperClass{ ?
????static{ ?
????????System.out.println(sub?class?init.); ?
????} ?
} ?
?
public?class?test{ ?
????public?static?void?main(String[]args){ ?
????????System.out.println(SubClass.value); ?
????} ?
???? ?
}?
输出结果是:super class init。
/** ?
?*?被动引用情景2 ?
?*?通过数组引用来引用类,不会触发此类的初始化 ?
?*?@author?volador ?
?* ?
?*/?
public?class?test{ ?
????public?static?void?main(String[]?args){ ?
????????SuperClass?s_list=new?SuperClass[10]; ?
????} ?
}?
输出结果:没输出
/** ?
?*?被动引用情景3 ?
?*?常量在编译阶段会被存入调用类的常量池中,本质上并没有引用到定义常量类类,所以自然不会触发定义常量的类的初始化 ?
?*?@author?root ?
?* ?
?*/?
class?ConstClass{ ?
????static{ ?
????????System.out.println(ConstClass?init.); ?
????} ?
????public?final?static?String?value=hello; ?
} ?
?
public?class?test{ ?
????public?static?void?main(String[]?args){ ?
????????System.out.println(ConstClass.value); ?
????} ?
}?
输出结果:hello(tip:在编译的时候,ConstClass.value已经被转变成hello常量放进test类的常量池里面了)
以上是针对类的初始化,接口也要初始化,接口的初始化跟类的初始化有点不同:
您可能关注的文档
- 凯文英语中心凯文老师李安人定胜天还是心存敬畏《少年派的奇幻漂流》中英文.doc
- 凯程2017考研答疑系列:如何利用历年真题.doc
- 凯程卢同学:2016年北京大学金融专硕复习经验分享.doc
- 凯程卢同学:2016年北京大学金融专硕复习经验宝典.doc
- 凯程卢同学:2016年北京大学金融专硕复习经验汇总.doc
- 凯程卢同学:2016年北京大学金融专硕状元复习经验交流详谈.doc
- 凯程卢同学:2016年北京大学金融专硕状元复习经验方法.doc
- 凯程卢同学:2016年北京大学金融专硕状元复习经验详谈.doc
- 凯程卢同学:2016年北京大学金融专硕状元考研复习心得体会.doc
- 凯程卢同学:2016年北京大学金融专硕考研复习心得体会.doc
文档评论(0)