「JVM 类加载子系统」系列文章

类加载器

加载阶段需要完成的一个核心任务:「通过一个类的全限定名来获取定义此类的二进制字节流

Java 虚拟机设计团队有意将这一任务放到 Java 虚拟机外部,以便让应用程序自己去决定如何获取所需的类

实现这个任务的代码就被作:类加载器

类的唯一性

类加载器虽然只用于完成实现类的加载动作,但它在 Java 程序中起到的作用却远超类加载阶段

每个 Class 对象都有一个方法:getClassLoader()。顾名思义,获取加载该 Class 对象的类加载器

对于任意一个类,都必须由它的类加载器和这个类本身一起共同确定它在 Java 虚拟机中的唯一性

更通俗一点:比较两个类是否「相等」,只有在这两个类是由同一个类加载器加载的前提下才有意义;否则,即使这两个类来源同一个 Class 文件,被同一个 Java 虚拟机加载,只要加载它们的类加载器不同,那么这两个类就必定不相等

类加载器的分类

从 Java 虚拟机的角度,只有两种不同的类加载器:

从 Java 开发人员的角度,类加载器的划分更细致一些:

它们三者的关系如下:(增加了一个自定义类加载器)

4

由于启动类加载器是由 C++ 实现,所以只会输出一个null

关于三者的源码分析可见 剖析 [Bootstrap、Extension、Application] ClassLoader

下面可以更具体的输出一下每个类加载器加载的类库