java类的加载机制及加载过程,类的加载机制是什么
本文将介绍Java的类加载机制的步骤。请看以下细节。
如何解决写爬虫IP受阻的问题?立即使用。
类加载机制
一个类的整个生命周期包括七个阶段:加载、验证、准备、解析、初始化、使用和卸载,从加载到虚拟机内存到卸载。其中验证、准备、分析统称为链接,这七个阶段的顺序如下图所示:
类加载的时机
主动引用:一个类被主动引用后,会触发初始化过程(加载、验证、准备需要在此之前开始)。
1)遇到new、getstatic、putstatic或invokestatic这四个字节码指令时,如果类还没有初始化,需要先触发其初始化。生成这四条指令最常见的Java代码场景是:用new关键字实例化一个对象的时候,读取或设置一个类的静态字段的时候(final修饰的静态字段除外,已经被编译器放入常量池的结果),调用一个类的静态方法的时候。
2)使用java.lang.reflect包的方法对类进行反射调用时,如果类还没有初始化,需要先触发其初始化。
3)初始化一个类时,如果发现其父类还没有初始化,就需要触发父类的初始化。
4)虚拟机启动时,用户需要指定一个正在执行的main类(包含main()方法的类),虚拟机先初始化这个类。
5)使用jdk7的动态语言支持时,如果java.lang.invoke.MethodHandle实例REF_getStatic、REF_putStatic、REF_invokeStatic的最终解析结果的方法句柄,且该方法句柄对应的类尚未初始化,则需要先初始化触发器。
被动引用:如果一个类是被动引用,该类将不会触发初始化过程。
1)通过子类引用父类的静态字段不会导致子类被初始化。对于静态字段,只会初始化直接定义该字段的类,所以当我们通过子类引用父类中定义的静态字段时,只会触发父类的初始化,而不会触发子类的初始化。
2)通过数组定义引用类不会触发该类的初始化。
3)在编译阶段,常量将存储在调用类的常量池中。本质上,没有对定义常数的类的直接引用,所以不会触发定义常数的类的初始化。这就是java类加载机制的细节。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。