一言以蔽之-类加载机制

234 阅读1分钟

概述

JVM把class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这就是类加载机制。

类加载的过程

加载:通过类的全限定名获取此类的二进制字节流,并转换为java.lang.Class对象。

验证:校验class文件字节流的数据安全,确保不会危害虚拟机的安全。

准备:为类变量分配内存并设置类变量初始值。

解析:将常量池的符号引用替换为直接引用。

初始化:静态变量赋值和执行静态代码块。

类加载器

启动类加载器:加载/lib目录下的类库。

扩展类加载器:加载/lib/ext目录下的类库。

应用类加载器:加载用户类路径下指定的类库。

双亲委派模型

类加载器收到类加载请求时,自己不加载先让父加载器加载,向上递归操作,当父加载器加载不了时,再自己加载。

双亲委派模型的好处

1.防止核心类的api被篡改

2.避免重复加载

破坏双亲委派模型

继承java.lang.ClassLoader类,重写loadClass方法。

例子

  • JDBC破坏双亲委派。DriverManager已经被启动类加载器加载了,那么加载第三方实现类的时候,只能通过AppClassLoader加载器的方式破坏双亲委派机制。

  • Tomcat破坏双亲委派。不同的应用程序可能会依赖同一个类库的不同版本,所以需要web容器为每个应用提供单独的WebAppClassLoader加载器。


如果觉得有帮助,就请点个赞鼓励一下吧。

3.png