对类加载的理解

什么是类加载机制

类加载机制就是指将描述类的数据信息从class文件中加载到内存,然后进行数据验证、解析和初始化。

三种类加载器

主要介绍一下 JDK 提供的三种类加载器,分别是 BootstrapClassLoader(启动类加载器),ExtClassLoader(扩展类加 载器),AppClassLoader(应用类加载器)。每一种类加载器都有其指定的类加载路径。
(1) BootstrapClassLoader(启动类加载器又称为根加载器/引导类加载器)主要加载 JAVA_HOME/jre/lib 里的 jar 包,该目录下的所有 jar 包都是运行 JVM 时所必需的 jar 包。
(2) ExtClassLoader 主要加载 Java 核心扩展类,即 JAVA_HOME/jre/ext 目录下的 jar 文件。
(3) AppClassLoader 主要加载的是开发者在应用程序中编写的类,即 CLASSPATH 路径下所有的 jar 文件。
在这里插入图片描述

双亲委派模型

类加载过程:

.java编译过程
javac编译器语法语义解析词法分析
.class字节码文件磁盘
java解释器类加载器
JVM内存

类加载机制采用双亲委派模型
ClassLoader 中的 LoadClass方法
图示:
在这里插入图片描述
双亲委派模型的工作过程如下:
(1)当前类加载器从自己已经加载的类中查询是否此类已经加载,如果已经加载则返回原来已经加载的类。
(2)如果没有找到,就去委托父类加载器去加载。父类加载器也会采用同样的策略,查看自己已经加载过的 类中是否包含这个类,有就返回,没有就委托其父类去加载,直到委托到启动类加载器为止。因为如果父类加载器为空了,就代表使用启动类加载器作为父加载器去加载该类。
(3)如果启动类加载器加载失败,就会使用扩展类加载器来尝试加载,继续失败则会使用 AppClassLoader 来 加载,继续失败就会抛出一个异常ClassNotFoundException。
为什么使用双亲委派模型?
安全性、避免创建过多重复的类
2)链接
·验证:验证字节码文件中的二进制字节流是否符合规范
·解析:解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程
逻辑地址(.class)->物理地址(JVM)
·准备:给类变量分配内存并“初始化”–>零值
3)初始化
给类变量赋值操作

自定义类加载器

如果用户想加载一个特定目录下的类时,就要用到用户自定义的类加载器。除了启动类加载器之外,所有的类 加载器都是 ClassLoader 的子类。 如果要编写一个自定义类加载器 MyClassLoader,那么很自然地 MyClassLoader 就要继承自 ClassLoader 类。源码 中提供了大量需要重写的方法,其中有三个方法是比较关键的: loadClass 方法、findClass 方法和 defineClass 方法。
1)loadClass:负责以双亲委托方式去加载类
2)findClass:就根据类的包路径找到 class 文件
3)defineClass:负责从 class 字节码中加载 Class 对象,然后 Class 对象通过反射机制才生成对象的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值