前言:
在看单例模式的时候,在网上找帖子看见其中有一种(IoDH) 实现单例的方式,其中用到了静态内部类,文章中有写到当jvm加载外部类的时候,并没有加载静态内部类这和之前自己想的不一样,特意在网上找了一些帖子总结一下。
一、学习前的疑问:
稍微了解Java虚拟机内的加载过程的步骤,都很清楚,一个类的静态资源、一些常量都是在类加载的时候就被加载金内存中分配空间了,所以我一开始理所当然的以为静态内部类中的静态变量同样属于静态资源,也应该在在内加载的时候被加载,然而实际情况却不是这样的,带着这个问题我上网找了几篇博客查找原因。
结果发现很多博客的结论都是错的,于是自己花了半下午的时间自己写程序测试
写测试代码前先澄清一个容易混淆的概念,类的装载和加载。这里用装载表示加载、验证、准备、解析、初始化五个过程。因为打印输出的代码只能写在执行的方法中,无论是静态代码块还是构造方法中,都是在初始化阶段执行的。因此只靠输出的日志只能判断类有没有初始化,不能判断类有没有加载(读取class文件)。因此还需要在
java.lang.ClassLoader类的loadClass方法中打断点,来看加载的类名。还需要再断点上加条件,否则要加载的类太多了,如下