类一定是在使用的时候才会被加载的么?
类加载器并不需要等到某个类被“首次主动使用”时再加载它,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; } }
来看一下控制台输出: