本文介绍了Java类加载机制的步骤。 请参阅以下详细内容。
类加载机制
类从加载到虚拟机内存中,到从内存中卸载;加载、验证、准备、分析、初始
加载类的时间
活动引用:当类被活动引用时,初始化过程开始。 加载、验证和准备必须在此之前开始。
1 )遇到new、getstatic、putstatic或invokestatic四字节代码指令时,如果类未初始化,必须首先触发初始化。 生成这四个指令的最常见的Java代码场景是,在使用new关键字实例化对象时,在读取或设置用final限定的类的静态字段时,编译器将结果放在常量池中的静态字段除外
2 )如果使用java.lang.reflect包中的方法反射调用类,则必须首先触发初始化(如果类尚未初始化)。
3 )初始化类时,如果发现父类尚未初始化,则必须触发父类的初始化。
4 )虚拟机启动时,用户必须指定要运行的包含主类(main )方法的类)。 虚拟机首先初始化这个类。
5 )使用jdk7动态语言支持时,java.lang.invoke.MethodHandle实例的最后一个分析结果REF_getStatic、REF_putStatic、REF_invokeStatic
被动引用:如果某个类是被动引用,则该类不会启动初始化过程
1 )在子类中引用父类的静态字段不会初始化子类。 对于静态字段,只会初始化直接定义该字段的类,因此在子类中引用父类中定义的静态字段只会触发父类的初始化,而不会触发子类的初始化。
2 )在数组定义中引用类,不引起这样的初始化。
3 )常量在编译阶段存储在调用类的常量池中,本质上不直接引用定义常量的类,因此不会触发定义常量的类的初始化。