java中类何时被加载_java类在何时被加载

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

-XX:+TraceClassLoading 监控类的加载

dfefdaf03bddcd392e0c1280c8f04426.png

我们新建了一个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版本。当运行启动类的时候,我们可以看到只有启动类被加载了。

8fdaa8ab9ecff56d909ab9cf03c32f79.png

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

1、创建父类的实例

743d77ff3ac857d4ffa3aa94a9ecb3cb.png

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

2、创建子类的实例

5818f15655a8f8daf5a07a91a6f37135.png

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

三、访问类的静态方法

f74468ea3160c8c9fad4fc4614d50119.png

四、访问类的静态变量

766db50008f13e55b5f6b67e636c2e69.png

五、反射 Class.forName()

86d7f147474951c752e319c1f990acbe.png

总结

java类在以上五种情况下会被加载。

在jvm生命周期中每个类如果存在,则不会重复加载。

在加载子类的时候会优先加载其父类。

类被加载的时候,其中的静态代码块、静态方法及静态变量也会被加载。

在初始化某个类时,如果这个类的静态代码块、静态方法或静态变量引用到了另一个类,则这个类也会被加载。

如果文章对您有帮助,请记得点赞关注哟~

欢迎大家关注我的公众号,每日推送技术文章供大家学习参考。

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值