jvm类加载器的父类委托机制

面试题精选 专栏收录该内容
27 篇文章 0 订阅

1. 两种类型的类加载器:

(1) JVM自带的加载器

- 根类加载器(Bootstrap) 它负责加载虚拟机的核心类库,如java.lang.*等

使用C++编写,它的实现依赖于底层操作系统,它并没有继承java.lang.ClassLoader类


- 扩展类加载器(Extension) 它的父加载器为根类加载器,它从jre\lib\ext子目录下加载类库,它使用Java代码实现,是java.lang.ClassLoader类的子类。


- 系统类加载器(System - 应用类加载器) 它的父加载器为扩展类加载器,它从环境变量classpath中加载类,它是用户自定义的类加载器的默认父加载器。它使用java实现,是java.lang.ClassLoader类的子类。


注意:父子加载器并非继承关系,也就是说子加载器不一定是继承了父加载器

他们其实是一种包装关系 

protected ClassLoader(ClassLoader parent){

}


(2) 用户自定义的类加载器

- java.lang.ClassLoader的子类

- 用户可以定制类的加载方式



2. 父类委托机制:




3. 为何使用父类委托机制?

父类委托机制的优点是能够提高软件系统的安全性,假设我自己定义一个类加载器,然后随便伪造一个类,这个类不符合jvm规范,里面有不安全的代码,如果不适用父类委托机制,那么这个类就会被直接加载到内存里面了。 

如果使用父类委托,那么就会被父加载器加载,它会按照jvm规范来加载,不符合规范就不会加载。


4. 运行时包:

决定两个类是不是属于同一个运行时包,不仅要看它们的包名是否相同,还要看定义类加载器是否相同,只有属于同一运行时包的类才能互相访问包可见的类和类成员,这样的限制能避免用户自定义的类冒充核心类库的类区访问核心类库的包可见成员。

  • 3
    点赞
  • 2
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值