分析Java类加载全过程.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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类的常量池里面了) 以上是针对类的初始化,接口也要初始化,接口的初始化跟类的初始化有点不同:

文档评论(0)

ktj823 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档