java中类加载器与类的加载过程

虚拟机自带的类加载器

启动类加载器(Bootstrap ClassLoader

  • 这个类加载使用C/C++语言实现的,嵌套在JVM内部。
  • 它用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar、resources.jar或sun.boot.class.path路径下的内容),用于提供JVM自身需要的类
  • 并不继承自ava.lang.ClassLoader,没有父加载器。
  • 加载扩展类和应用程序类加载器,并指定为他们的父类加载器。
  • 出于安全考虑,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类

扩展类加载器

  • Java语言编写,由sun.misc.Launcher$ExtClassLoader实现。
  • 从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK的安装目录的jre/1ib/ext子目录(扩展目录)下加载类库。如果用户创建的JAR放在此目录下,也会自动由扩展类加载器加载。

应用程序类加载器

  • java语言编写,由sun.misc.LaunchersAppClassLoader实现
  • 它负责加载环境变量classpath或系统属性java.class.path指定路径下的类库
  • 该类加载是程序中默认的类加载器,一般来说,Java应用的类都是由它来完成加载
  • 通过ClassLoader#getSystemclassLoader() 方法可以获取到该类加载器

用户自定义类加载器

JDK9之前的Java应用都是由上述三种类加载器互相配合来完成加载的,如果有必要,还可以加入自定义的类加载器来扩展,满足一些特殊的需求。

双亲委派模型

java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类加载器处理,它是一种任务委派模式。

工作流程:

当一个类加载器收到了类加载的请求时,这个类加载器不会自己先去加载,它会把这个请求委托给自己的父类加载器去执行。

请求交给父类加载器后,如果父类加载器还存在父类加载器,则继续向上提交,委托给父类加载器,直到提交到顶层的启动类加载器。

如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载。

破环双亲委派模型 

双亲委派模型的第一次"被破坏"其实发生在双亲委派模型出现之前——即JDK 1.2面世以前的"远古"时代

 第二次破坏双亲委派机制:线程上下文类加载器(ClassLoader.getSystemClassLoader( ))

双亲委派模型的第三次"被破坏"是由于用户对程序动态性的追求而导致的。如:代码热替换(Hot Swap)、模块热部署(Hot Deployment)

 类的加载过程

  1. 加载(Loading):在加载阶段,类加载器通过类的全限定名查找并加载类的字节码文件。加载器可以在文件系统、网络或其他来源中找到字节码文件。加载成功后,将生成一个代表该类的Class对象。

  2. 验证(Verification):在验证阶段,对加载的字节码进行验证,确保其符合Java语言规范。验证过程包括文件格式验证、元数据验证、字节码验证和符号引用验证等。

  3. 准备(Preparation):准备阶段是为类的静态变量分配内存,并设置默认初始值。这些变量会被初始化为默认的零值,例如数值类型为0,布尔类型为false。

  4. 解析(Resolution):解析阶段是将类中的符号引用转换为直接引用的过程。符号引用包括类、方法、字段的全限定名等。解析可以在加载阶段完成,也可以在运行时延迟到使用阶段。

  5. 初始化(Initialization):在初始化阶段,执行类的初始化代码,包括静态变量的赋值和静态块的执行。初始化是类加载的最后阶段,也是类加载器处理的最后一步。

需要注意的是,类加载是延迟加载的,即在需要使用类时才会进行加载。此外,Java虚拟机规范允许自定义类加载器,开发人员可以通过扩展ClassLoader类来实现自定义的加载逻辑。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值