类加载器可能将网络上的、或者内存中地 .class文件读取到内存中,并生成class对象,同一类不会被加载第二次。JVM依据同一包名+类名的方式判断当前类是否已经加载。如果相同的类名分布在不同的包下面,JVM会分别加载这两个类,但是生成的对象不同。
组成:
在JVM启动的时候,会由启动类加载器BootstrapClassLoader、扩展类加载器Extension ClassLoader、系统类加载器App ClassLoader三部分组成初始类加载器。
关系:
父子级 = 启动类加载器 > 扩展类加载器 > 系统类加载器
加载机制:
他们都采取向上传递的机制,即有了要加载的类,先问问自己的父加载器,若父加载器不能加载,自己再加载
1. 启动类加载器BootstrapClassLoader
基于JVM核心的启动器,它会加载java.lang.ClassLoader以及其他的java平台类,当启动类加载器开始运行时,会加载扩展类加载器和系统类加载器。类似于整个程序的启动钥匙,所以,启动类加载器加载的并非JAVA类,反之其他加载器加载的都是JAVA类
package com.shtec.classLoader;
import sun.misc.Launcher;
public class JvmClassLoaderTest {
public static void main(String[] args) {
//ClassLoader是由启动类加载器加载的
System.out.println(ClassLoader.class.getClassLoader());//null
//Launcher内部定义了系统和扩展类加载器,为null,说明系统和扩展类加载器是由启动类加载器加载的
System.out.println(Launcher.class.getClassLoader());//null
}
}
2、扩展类加载器Extension ClassLoader:
扩展类加载器只能加载jar包中的内容(ZIP),加载都是基础的文件
3、系统类加载器App ClassLoader:
第三方jar包和自己编写java文件
package classLoader.com.liuyahui;
public class ClassLoaderTest {
public static void main(String[] args) {
System.out.println(ClassLoaderTest.class.getClassLoader());
// 打印自己编写的一个测试类,结果为AppClassLoader,证明系统类加载器加载的为自己的代买文件
// sun.misc.Launcher$AppClassLoader@73d16e93
}
}