JVM(十)-- 类的加载器
目录
一、概述
1. 类的加载分类
2. 类加载机制的基本特征
二、类加载器的分类
1. 引导类加载器
2. 扩展类加载器
3. 系统类加载器
三、双亲委派机制
1. 定义与本质
2. 优势和劣势
3. 破坏双亲委派机制
四、沙箱安全机制
五、自定义类加载器
1. 为什么要自定义类加载器?
2. 实现方法
一、概述
类加载器是JVM执行类加载机制的前提。
ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.class对象实例。然后交给Java虚拟机进行链接、初始化等操作。因此,ClassLoader在整个装载阶段,只能影响到类的加载,而无法通过ClassLoader去改变类的链接和初始化行为。至于它是否可以运行,则由执行引擎决定。
1. 类的加载分类
2. 类加载机制的基本特征
二、类加载器的分类
JVM支持两种类型的类加载器,分别为引导类加载器(启动类加载器)和自定义类加载器。
启动类加载器是使用C++实现的,其他的加载器都是使用Java来实现的。
1. 引导类加载器
该加载器用来加载Java的核心类库,用于提供JVM自身需要的类。
它用于加载扩展类加载器和应用程序类加载器,并指定为它们的父类加载器。
2. 扩展类加载器
3. 系统类加载器
自定义的类默认使用系统类加载器。
三、双亲委派机制
1. 定义与本质
双亲委派机制就是为了保证类的唯一性,只能被加载一次。
2. 优势和劣势
优势:
- 避免类的重复加载,确保了一个类的全局唯一性。
- 保护程序安全,防止核心API被篡改。
劣势:
- 检查类是否加载的委托过程是单向的,这个方式虽然从结构上来说比较清晰,使各个ClassLoader的职责非常明确,但是会带来一个问题,即顶层的ClassLoader无法访问底层的ClassLoader所加载的类。
3. 破坏双亲委派机制
第一次:
第二次:
第三次:
四、沙箱安全机制
沙箱机制就是将Java代码限定在虚拟机特定的运行范围中,并且严格限制代码对本地系统资源的访问。通过这样的措施来保证对代码的有限隔离,防止对本地系统造成破坏。
五、自定义类加载器
1. 为什么要自定义类加载器?
- 隔离加载类:在某些框架内进行中间件与应用的模块隔离,把类加载到不同的环境。比如:阿离内部某容器的框架通过自定义类加载器确保应用中依赖的jar包不会影响到中间件运行时使用的jar包。
- 修改类加载的方式:类的加载模型并非强制,可以根据实际情况在某个时间点按需进行动态加载。
- 扩展加载源:比如从数据库、网络等地方进行加载。
- 防止源码泄露:Java代码容易被编译和篡改,可以进行编译加密。那么类加载器也需要自定义,还原加密的字节码。