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

类加载器并不需要等到某个类被“首次主动使用”时再加载它,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;
    }
}

来看一下控制台输出:

 

posted @ 2020-04-20 03:21  cao_xiaobo  阅读(763)  评论(0编辑  收藏  举报