一 什么是类加载
JVM将 class字节码 文件加载到内存中, 并将这些静态数据转换成 方法区 中的运行时数据结构,在堆中 生成一个代表这个类的java.lang.Class 对象 ,作为方法区类数据的访问入口。
二 类加载过程
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括: 加载、链接( 验证、准备、解析 )、初始化、使用 和 卸载 七个阶段
三 类加载器
使用 C++ 实现,负责加载存放在 JDK\jre\lib (JDK 代表 JDK 的安装目录,下同)下,或被 -Xbootclasspath 参数指定的路径中的,并且能被虚拟机识别的类库(如 rt.jar,所有的 java.* 开头的类均被 Bootstrap ClassLoader 加载)。 启动类加载器是无法被 Java 程序直接引用的。
类加载器负责加载所有的类,其为所有被载入内存中的类生成一个java.lang.Class实例对象。一旦一个类被加载如JVM中,同一个类就不会被再次载入了。正如一个对象有一个唯一的标识一样,一个载入JVM的类也有一个唯一的标识。在Java中,一个类用其全限定类名(包括包名和类名)作为标识;但在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识。例如,如果在pg的包中有一个名为Person的类,被类加载器ClassLoader的实例kl负责加载,则该Person类对应的Class对象在JVM中表示为(Person.pg.kl)。这意味着两个类加载器加载的同名类:(Person.pg.kl)和(Person.pg.kl2)是不同的、它们所加载的类也是完全不同、互不兼容的。
JDK自带有三个类加载器:
bootstrap ClassLoader,ExtClassLoader,AppClassLoader
bootstrap ClassLoader是ExtClassLoader的父类加载器,默认负责加载%JAVA_HOME%lib下的jar包和class文件。
ExtClassLoader是AppClassLoader的父类加载器,负责加载%JAVA_HOME%/lib/ext文件夹下的jar包和class类。
AppClassLoader是自定义类加载的父类,负责加载classpath下的类文件。系统类加载器,线程上下文加载器
继承ClassLoader实现自定义类加载器