类加载子系统
2021-09-11 17:26:00 0 举报
类加载子系统
作者其他创作
大纲/内容
是否加载
补充
双亲委派机制
作用:从本地或网络中获取.class字节码文件,加载到内存中。同时进行一系列校验、准备、解析阶段。并将加载后的类信息放入方法区。
类加载子系统
User Costom Class Loader
.class字节码
类的加载过程(图解)
准备
引导类加载器/启动类加载器
初始化
扩展类加载器由Java语言编写,父类为启动类加载器,用来加载系统目录属性指定下的其他类库
应用程序类加载器,父类为扩展类加载器,负责加载classpath环境变量和java.lang.path指定的类型,是Java中默认的类加载器,大部分类都由该加载器加载完成
验证当前包含类信息的字节流中是否符合当前虚拟机的要求,确保被加载类的正确性,同时保证了程序的安全。主要验证方面从文件格式验证、元数据验证、字节码验证、符号引用验证。
Extension Class Loader
作用
是否加载顺利
判断两个类对象是否为同一个类,不仅需要判断类的全限定名称,包括包名是否一致,还会判断类的加载器是否相同。
类加载器
BootStrap Class Loader
解析操作就是将常量池的符号引用替换为直接引用的过程。 解析操作其实是在初始化完成后才会执行的操作。
概述:当类加载器收到加载类的请求时,并不会自己加载,而是会先将请求委托给父类加载器加载,而父类加载器如果也有父类加载器,会继续向上委托,利用递归的方式最终到达顶层类加载器。如果父类加载器成功加载后会返回,如果加载失败会将请求重新返回给子类加载器,子类加载器才会尝试着自己去加载,这就是双亲委派机制。 作用:保护了核心类库不会泄漏,避免类的重复加载
Y
解析
System Class Loader
准备阶段主要是为类变量分配内存空间,为该类的类变量初始化,即赋零值 被final修饰的类变量,不需要分配,在编译阶段就已经分配,准备阶段会显式赋值。 类的成员变量不会初始化,因为它在创建实例的时候,跟随一起存储在堆区,而类变量存储在方法区
抛出异常
加载
📕 从本地文件中获取.class文件 📕 从网络中获取.class文件 📕 从压缩包zip或jar包中直接读取.class文件 📕 运行时生成,例如动态代理 📕 从专有的数据库中获取.class文件 📕 由其他文件生成.class文件 📕 从加密文件中读取.class文件
类 的 加 载 过 程
引导类加载器由C/C++编写,当程序启动时,启动引导类加载器,同时创建一个初始类,去加载JDK的核心类库,来提供JVM所需的类。同时会启动扩展类加载器和。为保证安全,仅加载java、javax、sun目录下的jar包
链接
扩展类加载器
访问类的main函数入口
N
类加载器仅分为两类,启动类加载器和自定义类加载器。将所有派生于抽象类ClassLoader的类加载器统称为自定义类加载器
验证
获取.class文件的几种方式
类的主动使用包括如下七种情况: 1. 创建类的实例对象 2. 访问类的静态变量,或给静态变量赋值 3. 调用类的静态方法 4. 放射 5.初始化一个类的子类 6. 程序启动时被标明为启动类的类 7. 动态语言支持 除了上述七种情况以外,其他任何方式对类的调用,都属于类的被动使用,都不会导致类的初始化
1.通过该类的全限定类名生成一个代表该类的二进制字节流 2.通过代表该类的二进制字节流将类的静态存储结构转换为方法区的运行时数据结构 3.在内存中生成一个代表该类的java.lang.Class对象,作为方法区这个类的数据访问入口
类的主动使用和被动使用
应用程序类加载器
初始化就是执行类构造器的过程。 类构造器无需创建,自动收集类信息中包含的类变量和静态代码块中的语句。 类构造器和类的构造器二者并不相同,前者(cliinit)初始化类的信息,后者在对象创建的时候进行调用
0 条评论
下一页