概述
JVM把class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这就是类加载机制。
类加载的过程
加载:通过类的全限定名获取此类的二进制字节流,并转换为java.lang.Class对象。
验证:校验class文件字节流的数据安全,确保不会危害虚拟机的安全。
准备:为类变量分配内存并设置类变量初始值。
解析:将常量池的符号引用替换为直接引用。
初始化:静态变量赋值和执行静态代码块。
类加载器
启动类加载器:加载/lib目录下的类库。
扩展类加载器:加载/lib/ext目录下的类库。
应用类加载器:加载用户类路径下指定的类库。
双亲委派模型
类加载器收到类加载请求时,自己不加载先让父加载器加载,向上递归操作,当父加载器加载不了时,再自己加载。
双亲委派模型的好处
1.防止核心类的api被篡改
2.避免重复加载
破坏双亲委派模型
继承java.lang.ClassLoader类,重写loadClass方法。
例子
-
JDBC破坏双亲委派。DriverManager已经被启动类加载器加载了,那么加载第三方实现类的时候,只能通过AppClassLoader加载器的方式破坏双亲委派机制。
-
Tomcat破坏双亲委派。不同的应用程序可能会依赖同一个类库的不同版本,所以需要web容器为每个应用提供单独的WebAppClassLoader加载器。
如果觉得有帮助,就请点个赞鼓励一下吧。