java类在何时被加载

23次阅读

共计 1161 个字符,预计需要花费 3 分钟才能阅读完成。

我们接着上一章的代码继续来了解一下 java 类是在什么时候加载的。在开始验证之前,我们现在 IDEA 做如下配置。
-XX:+TraceClassLoading 监控类的加载

我们新建了一个 TestController 来测试类的加载时机,代码如下:

@RestController
public class TestController {@RequestMapping("/newInstance")
    public String newInstance(){Father father = new Father();
        return "";
    }
    @RequestMapping("/newChildrenInstance")
    public String childrenInstance(){Children children = new Children();
        return "";
    }
    @RequestMapping("/staticField")
    public String staticField(){

        String staticValue = Children.staticValue;
        return "";
    }

    @RequestMapping("staticMethod")
    public String staticMethod(){String bed = Children.bed();
        return "";
    }

    @RequestMapping("classForName")
    public String classForName() throws Exception {Class.forName("com.zhixie.jvmclassload.demo.Children");
        return "";
    }
}

一、定义了 main 的类,启动 main 方法时该类会被加载

本次验证采用的是 springboot 2.2.0 版本。当运行启动类的时候,我们可以看到只有启动类被加载了。

二、创建类的实例,即 new 对象的时候

1、创建父类的实例


此时被加载的类有 Father 及 Field 类,我们重启服务,然后去访问创建子类的实例。 为什么要重启呢?因为每个类在虚拟机生命周期中只会被加载一次。不重启的话,看不到我们想要的效果。

2、创建子类的实例


在创建子类实例的时候,在加载子类之前会优先加载其父类。

三、访问类的静态方法

四、访问类的静态变量

五、反射 Class.forName()

总结

  • java 类在以上五种情况下会被加载。
  • 在 jvm 生命周期中每个类只会被加载一次。
  • 在加载子类的时候会优先加载其父类。
  • 类被加载的时候,其中的静态代码块、静态方法及静态变量也会被加载。
  • 在初始化某个类时,如果这个类的静态代码块、静态方法或静态变量引用到了另一个类,则这个类也会被加载。

如果文章对您有帮助,请记得点赞关注哟~
欢迎大家关注我的公众号 < 情系 IT>,每日推送技术文章供大家学习参考。

正文完
 0