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,是一个一对多的双向关联