深入理解JVM(3)

01 类加载器与类初始化的深度剖析

  • 案例1
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述
  • 把final去掉可以,出现静态代码块中的结果,主动使用中的一种。
  • 在final的前提下,如果是 Random 则运行期才能确定,依旧会输出 static 块
  • 反编译
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 案例2
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述
  • +XX:+TraceClassLoading验证上述结论
    在这里插入图片描述

  • 案例3
    在这里插入图片描述
    在这里插入图片描述

  • 案例4
    在这里插入图片描述
    在这里插入图片描述
  • 案例5
    在这里插入图片描述
    在这里插入图片描述

02 不同类加载器作用与加载动作分析

  • 案例1
    在这里插入图片描述
    一种好的学习方法是去看JAVADOC文档,而不是去拾人牙慧,以下是ClassLoader类的源码
  • getSystemClassLoader()的文档
    在这里插入图片描述
  • 第一段翻译:返回委托的系统类加载器。它是新的类加载器实例的默认委托的双亲,并且是典型的用于启动应用的类加载器。如下图,不指定的话,自定义类加载器的双亲就是系统类加载器
    在这里插入图片描述
  • 第二段翻译:这个方法在运行启动顺序中被地第一个较早地调用,在那时它创建系统类加载器并且将其设定为一个调用上下文的类加载器。第三段:默认系统类加载器是和这个类实现相关的实例。第四段:如果这个系统属性java.system.class.loader被定义,当这个方法第一次被调用,然后这个属性的值被赋予作为系统类加载器将被返回的类名。这个类被加载使用默认的系统类加载器,而且必须被定义一个public的构造方法,这个构造方法接收一个被用来作为委托父类的ClassLoader类型的参数。一个实例然后被创建使用这个默认系统类加载器作为参数的构造器。这个得到的类加载器被定义为系统类加载器
    在这里插入图片描述
    这个方法里面还有private final ClassLoader parent;
  • 继续编写代码
    在这里插入图片描述
  • 源代码如下:
    在这里插入图片描述
  • 执行结果
    在这里插入图片描述
  • 案例2

在这里插入图片描述

在这里插入图片描述

  • 方法对应的JavaDoc

在这里插入图片描述

  • 继续编写

在这里插入图片描述

  • 方法源码

在这里插入图片描述

03 获得ClassLoader的途径

class对象被相应的类加载器加载后,保存着关联此加载器的引用。而类加载器也知道它加载过的那些class,是一个一对多的双向关联
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了84 篇原创文章 · 获赞 90 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_42512488/article/details/89853248