类加载器子系统
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PwtIAE9o-1629257992568)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210818102657743.png)]](https://i-blog.csdnimg.cn/blog_migrate/e1ab2795e74a522b1ecab4c7f289f785.png)
内存结构概述
类加载器与类的加载过程
class文件可以从文件系统或者网络中加载
ClassLoder只负责类的加载,类的运行由ExecutionEngine决定
类被加载后,会存放在方法区的内存空间中。除了类信息外,方法去中还存放运行时常量池信息,可能还包含字符串字面量和数字常量(从class文件中常量池部分的内存映射)
类加载器扮演的角色
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CxIkekf7-1629257992570)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210818104006418.png)]](https://i-blog.csdnimg.cn/blog_migrate/729714ef027e64aaf96195cace05ddfa.png)
.class文件 -> JVM -> 最终的元数据模板 这个过程的运输和处理工具为 类加载器 ClassLoader
类加载过程
加载 链接 (验证 准备 解析) 初始化
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KKxwEm37-1629257992570)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210818104711974.png)]](https://i-blog.csdnimg.cn/blog_migrate/be0e673caf442212636db725cfaa0a74.png)
加载:
1、通过一个类的全限定名获取此类的二进制字节流
2、将这个字节流中的静态存储结构转化为方法区的运行时数据结构
3、在内存中生成一个代表此类的java.lang.class对象,作为方法区这个类的各种数据的访问入口
链接
1、验证:验证字节码文件是否符合当前虚拟机规范,包括四种验证方式:文件格式验证、元数据验证、字节码验证、符号引用验证
2、准备:为类变量分配内存并且设置该类变量的默认初始值;不包括final 修饰的static变量,final修饰的变量在编译阶段就被分配,当前阶段会显示初始化;不会为类的实例变量分配内存,类变量分配在方法区中,而实例变量会随着对象分配到堆中
3、解析:将常量池中的符号应用转换为直接引用的过程;事实上,解析操作往往会伴随着JVM的初始化之后执行
初始化:
初始化阶段就是执行类的构造器方法(())的过程
此方法不需要定义,由javac编译器自动收集类变量和类的静态代码块中的语句合并而来
构造器方法中的指令按语句在源文件中的出现顺序执行
若该类有父类,则会限制性父类的()
JVM保证在多线程下,()方法被同步加锁
类加载器分类
引导类加载器 BootstrapClassLoader:JAVA_HOME/jar/lib/rt.jar
扩展类加载器ExtClassLoader:jre/lib/ext
应用类加载器AppClassLoader:
自定义ClassLoder需要继承ClassLoader或者直接继承URLClassLoader
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qmJaXe4n-1629257992572)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210818113325381.png)]](https://i-blog.csdnimg.cn/blog_migrate/560f6956e918da32ab9a81a0f0193d70.png)
自定义类加载器的意义
隔离加载类
修改加载的方式
扩展加载源
防止源码泄露
ClassLoder的使用说明
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RqWpV1zP-1629257992573)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210818102201430.png)]](https://i-blog.csdnimg.cn/blog_migrate/d33163c92c794565d377ec339ce8e0ba.png)
双亲委派机制
定义:把加载的请求交给父类处理
1、当需要加载一个类的时候,子类加载器先交给父类去加载这个类
2、如果父类可以加载这个类,则加载,返回成功
3、如果父类不可以加载类,子类才会去加载这个类
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XAJFkadW-1629257992574)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210818113600485.png)]](https://i-blog.csdnimg.cn/blog_migrate/f9e73a6ec50a2f6a9ace440cff9c47df.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TDjBpeUI-1629257992575)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210818113615886.png)]](https://i-blog.csdnimg.cn/blog_migrate/3c82c35e64ede99ef471fcac21471517.png)
优势:
避免类的重复加载
保证程序安全,防止核心类被篡改
沙箱安全机制
举例:当我们自定义一个java.lang.String类,在加载此类时,会交给引导类加载器加载,而我们自定义的string将不会被加载
补充
如何判断两个类一个类的必要条件
1、类的完整类名必须一致
2、加载两个类的ClassLoader是同一个
如何判断类是主动加载还是被动加载
判断依据:被动使用不会导致类的初始化(即会不会执行clinit方法)
string将不会被加载
补充
如何判断两个类一个类的必要条件
1、类的完整类名必须一致
2、加载两个类的ClassLoader是同一个
如何判断类是主动加载还是被动加载
判断依据:被动使用不会导致类的初始化(即会不会执行clinit方法)
本文详细介绍了Java的类加载器子系统,包括类加载的加载、链接、初始化过程,以及双亲委派机制。同时,阐述了类加载器的分类,如BootstrapClassLoader、ExtClassLoader和AppClassLoader,并讨论了自定义类加载器的意义和使用。此外,内容还涵盖了类加载器如何确保类的唯一性和初始化条件,以及如何判断类加载和初始化的方式。
1334

被折叠的 条评论
为什么被折叠?



