青鸟飞扬 一个类在什么情况下才会被加载到 JVM 中?

发布日期:2025-05-23 23:35    点击次数:60


Java 程序对类的使用方式可分为两种:

主动使用

被动使用

特别的重要:

所有的 Java 虚拟机实现必须在每个类或接口被 java 程序首次主动使用时才初始化他们。

主动使用(八种情况):

1)创建类的实例,比如 new 一个对象

2)访问某一个类或接口的静态变量,或者对该静态变量赋值 (访问类的静态变量的助记符 getstatic,赋值是 putstatic)。

3)调用类的静态方法 (应用 invokestatic 助记符)。

4)使用 java.lang.reflect 包的方法对类型进行反射调用,比如:Class.forName (“com.test.Test") 通过反射的方式获取类的 Class 对象。

5)初始化一个类的子类,比如有 class Parent {}、子类 class Child extends Parent {},当初始化 Child 类时也表示对 Parent 类的主动使用,Parent 类也要全部初始化。

6)Java 虚拟机启动时被标注为启动类的类,即有 main 方法的类。

7)JDK1.7 开始提供的动态语言支持:java.lang.invoke.MethodHandle 实例的解析结果 REF_getStatic, REF_putStatic, REF_invokeStatic 句柄对应的类没有初始化,则初始化。

8)当一个接口中定义了 JDK 8 新加入的默认方法(被 default 关键字修饰的接口方法)时,如果有这个接口的实现类发生了初始化,那该接口要在其之前被初始化。

除了上述所讲的八种情况,其他使用 Java 类的方式都被看作是类的被动使用,都不会导致类的初始化。

另外,要特别说明的一点:

接口的加载过程与类加载过程会有所不同,接口不能使用 「static {}」语句块,但是编译器会为接口生成对应的 () 类构造器,用于初始化接口中所定义的成员变量。

主动使用的第 5 种:当子类初始化时,要求其父类也要全部初始化完成。但是,对于一个接口的初始化时,并不要求其父接口要全部初始化完成,只有在真正使用到父接口时(比如引用接口中定义的常量)时才会去初始化,有点延迟加载的意思。




Powered by 顶盛体育官方登录入口手机版 @2013-2022 RSS地图 HTML地图

Copyright Powered by365建站 © 2013-2024