目录
0.知识储备——JVM内存分区&双亲委派机制
双亲委派——类加载器默认不直接对字节码文件进行加载,而是交给它的上一级类加载器,递归这个操作,如果上一级没有加载,它自己才回去加载。
这篇文章向我们介绍了双亲一词的由来:
https://blog.csdn.net/VincentlVL/article/details/120516607
1.Java类加载机制
1.1核心类加载器启动原理
我们用Java语言编写的程序,经过javac编译[※注:javac所做的工作有词法分析、语法分析、语义分析]得到class文件,在JVM上运行的时候JVM会从软件层面为我们屏蔽不同操作系统在底层硬件和指令上的差别。但是在不同的系统上最终会得到不同的机器码,因此在选择JDK的时候要选择不同的版本,他们对应着不同的JVM实现。
类加载的含义:
JVM将编译产生的class文件(一种二进制文件)加载到内存中,且伴随对数据进行校验、转换解析、初始化,最终成为被JVM直接使用的Java类型,这个过程叫Java的类记载机制。
类加载过程:
1.类的加载
加载是一个读取class文件,将其转化为某种静态数据结构存储在方法区内,并在堆中生成一个便于java.lang.class 类型的对象的特征。
①类型的加载
在Java代码中,类型[※注:类型即编译产生的class文件]的加载、连接、初始化,都是在程序运行期间完成的。类型的来源丰富,包括数据库来源、本地源文件资源、下载的var包,jar包文件、网络数据来源等。
②加载的工具
通过类加载器来进行加载。
③载入位置
1.7方法区(1.8源空间)
2.类的连接
验证——验证当前的class文件是否是合法的
准备——为类的静态变量分配内存,并将其初始化为默认值
解析——把符号引用替换为直接引用
3.初始化
将真实的数据给到默认值去
1.2类加载的双亲委派机制
(图片摘自百度文库)
2.类加载器的类型
①启动类加载器(bootStrapClassLoader):C++编写,负责加载Java的核心类库
②拓展类加载器(extClassLoader): 负责核心类以外的新功能扩展类的加载
③应用类加载器(systemClassLoader):加载CLASSPATH环境变量所指定的jar包与类路径
④自定义加载器(userClassLoader):自定义类加载器
3.自定义类加载器的实现
1、如果不想打破双亲委派模型,那么只需要重写findClass方法即可
2、如果想打破双亲委派模型,那么就重写整个loadClass方法
CustomClassLoader即用户自定义的类加载器。创建流程:
1.创建一个私有的String类型的classPath变量。
2.创建一个带参数的构造器给classPath赋值。
3.继承classLoader类,重写findClass方法。
具体代码参考:自定义类加载器实现&源码分析