面试(类加载器)

一、目标

类加载器(ClassLoader)是Java虚拟机(JVM)的一部分,用于加载Java类文件到内存中,并生成对应的Class对象。类加载器负责在运行时查找和加载类文件,为Java程序提供动态加载和运行时扩展的功能。

二、类型

2.1、启动类加载器(Bootstrap ClassLoader)

也称为根加载器,它是JVM内嵌的加载器,负责加载Java核心类库(如java.lang包中的类)和其他需要在JVM启动时就被加载的类。它是所有其他类加载器的父加载器。由于是用C++实现的,因此在Java代码中无法直接获取到启动类加载器的引用。

2.2、扩展类加载器(Extension ClassLoader):

它是由sun.misc.Launcher$ExtClassLoader实现的,负责加载Java的扩展类库(如javax包中的类)。它是由启动类加载器加载的,并且是应用类加载器的父加载器。

2.3、应用类加载器(Application ClassLoader)

也称为系统类加载器,它是由sun.misc.Launcher$AppClassLoader实现的,负责加载应用程序的类。应用类加载器是用户自定义的类加载器的默认父加载器。

三、加载策略

3.1、问题

解决类的加载顺序、一致性、可靠性、唯一性等;

3.2、双亲委派机制

双亲委派机制(Delegation Model)是Java类加载器的一种加载策略,它定义了类加载器在加载类时的行为和优先级。

双亲委派机制的基本思想是:当一个类加载器需要加载一个类时,它首先将加载请求委派给父类加载器,只有当父类加载器无法加载该类时,才由自身加载器进行加载。这个过程会一直循环,直到顶层的启动类加载器。如果所有的父类加载器都无法加载该类,最终由子类加载器加载。

3.3、优势

3.3.1、避免类的重复加载

每个类加载器都有自己的命名空间,当父类加载器已经加载了一个类,子类加载器无需重新加载,直接使用父类加载器加载的类,避免了重复加载。

3.3.2、提供类加载的安全性和一致性

通过双亲委派机制,类加载器会沿着加载链向上委派加载请求,保证了加载的类来自于同一个源,确保了类的安全性和一致性。

3.3.3、确保核心类的一致性

由启动类加载器加载的核心类库是Java虚拟机的一部分,能够保证在不同的Java应用中,加载的核心类库是一致的。

需要注意的是,双亲委派机制并不是强制性的,可以通过自定义类加载器绕过双亲委派机制,实现特定的加载逻辑,例如热部署等需求。

双亲委派机制在Java中的应用非常广泛,不仅用于加载Java核心类库,还用于加载应用程序的类。它确保了类的加载按照优先级和一致性进行,提供了类加载的可靠性和安全性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值