详细分析Java类加载全过程.pptVIP

  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类加载全过程

Java培训 / 相关阅读: /sxrj/166/ * 详细分析Java类加载全过程 【IT168手工】今日去阅读了一下类的加载的进程,此时也总结一下:一个java文件从被加载到被卸载这个生命进程,总共要经历4个期间:加载-gt;连接(验证+准备+解析)-gt;初始化(操作前的准备)-gt;操作-gt;卸载其间加载(除了自定义加载)+连接的进程是完好由jvm担任的,甚么时辰要对类进行初始化作业(加载+连接在此之前现已完结了),jvm有严酷的规则(四种表象):1.碰着new,getstatic,putstatic,invokestatic这4条字节码指令时,干预类还没进行初始化,则立刻对其进行初始化作业。真实即是3种表象:用new实例化一个类时、读取或许设置类的静态字段时(不网罗被final修饰的静态字段,因为他们现已被塞进常量池了)、以及实行静态编制的时辰。2.操作java.lang.reflect.* 的编制对类进行反射移用的时辰,如果类还没有进行过初始化,立刻对其进行。3.初始化一个类的时辰,如果他的爸爸还没有被初始化,则先去初始化其爸爸。4.当jvm启动时,用户需求指定一个要实行的主类(包括staticvoidmain(String[]args)的阿谁类),则jvm会先去初始化这个类。以上4种预措置称为对一个类进行自动的征引,其他的其他表象,称为被迫征引,都不会触发类的初始化。下面也举了些被迫征引的比如:/***被迫征引表象1*通过进程子类征引父类的静态字段,不会致使子类的初始化*@authorvolador**/classSuperClass{static{System.out.println(superclassinit.);}publicstaticintvalue=123;}classSubClas***te ndsSuperClass{static{System.out.println(subclassinit.);}}publicclasstest{publicstaticvoidmain(String[]args){System.out.println(SubClass.value);}}输出成效是:superclassinit。/***被迫征引表象2*通过进程数组征引来征引类,不会触发此类的初始化*@authorvolador**/publicclasstest{publicstaticvoidmain(String[]args){SuperClasss_list=newSuperClass[10];}}输出成效:没输出/***被迫征引表象3*常量在编译期间会被存入移用类的常量池中,本质上并没有征引到定义常量类类,所以天 然不会触发定义常量的类的初始化*@authorroot**/classConstClass{static{System.out.println(ConstClassinit.);}publicfinalstaticStringvalue=hello;}publicclasstest{publicstaticvoidmain(String[]args){System.out.println(ConstClass.value);}}输出成效:hello(tip:在编译的时辰,ConstClass.value现已被改变成hello常量放进test类的常量池里边了)以上是关于类的初始化,接口也要初始化,接口的初始化跟类的初始化有点不合:上面的代码都是用static{}来输出初始化信息的,接口无法做到,但接口初始化的时辰编译器依 然会给接口天然生成一个()的类机关器,用来初始化接口中的成员变量,这点在类的初始化上也有做到。真实不合的处地址于第三点,类的初始化实行之前恳求父类全数都初始化完结了,但接口的初始化形似对父接口的初始化不若何感冒,也即是说,子接口初始化的时辰真实不恳求其父接口也完结初始化,只要在真实操作到父接口的时辰它才会被初始化(比如征引接口上的常量的时辰啦)。下面分解一下一个类的加载全进程:加载-gt;验证-gt;准备-gt;解析-gt;初始化首先是加载:这一块虚拟机要完结3件事:1.通过进程一个类的全约束名来取得定义此类的二进制字俭仆。2.将这个字俭仆所代表的静态存储布局转化为编制区的运行时数据布局。3.在java堆中天然生成一个代表这个类的java.lang.Class目标,作为编制区这些数据的访谒进口。关于第一点,很矫捷,许多 手工都是在这儿切入,因为它并没有约束二进制流从哪里来:从class文件来-gt;单个的文件加载从zip包中来-gt;加载jar中的类从汇会集来-gt;Applet..........对照与加载进程的其他几个期间,加载期间可控性最强,因为类的加载器能

文档评论(0)

专注于电脑软件的下载与安装,各种疑难问题的解决,office办公软件的咨询,文档格式转换,音视频下载等等,欢迎各位咨询!

1亿VIP精品文档

相关文档