类一定是在使用的时候才会被加载的么?

Posted caoxb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类一定是在使用的时候才会被加载的么?相关的知识,希望对你有一定的参考价值。

类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误

 

我们都知道类如果有其父类,或者说有实现的相关接口,那么优先加载相应的父类或接下。但是除了这种情况,还有以下几种情况类也会被加载。

添加虚拟机参数:-verbose:class

第1种情况:调用某个方法,调用的方法内部会使用到某个类

public class ReloadTest {

    public static void main(String[] args)  {
        System.out.println("----------开始执行main方法----------");
        // 调用test方法开始使用PrintTest类
        test();
    }
    
    public static void test() {
        System.out.println(PrintTest.class.getClass());
    }

}

技术图片

 

但是下面这种情况下是不会加载这个类的

main方法不做任何操作,即不使用PrintTest这个类,当然也不会加载这个类的

public class ReloadTest {
    static {
        System.out.println("----------开始执行static 代码块----------");
    }

    public static void main(String[] args) {
    }
    
    public static void test() {
        System.out.println(PrintTest.class);
    }

}

技术图片

 

第2种情况:将PrintTest类作为方法的返回类型

public class ReloadTest {
    static {
        System.out.println("----------开始执行static 代码块----------");
    }
    
    public static void main(String[] args) {
    }
    
    public PrintTest test() {
        return null;
    }
}

来看一下控制台输出:

技术图片

 

以上是关于类一定是在使用的时候才会被加载的么?的主要内容,如果未能解决你的问题,请参考以下文章

使用静态修饰时,无需创建对象即可加载类

MyBatis延迟加载和缓存

MyBatis延迟加载和缓存

延迟加载

在java中,为啥类实例也能访问静态域?

课堂笔记0518 static final