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

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){

}

jvm类加载器的父类委托机制_第1张图片

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

- java.lang.ClassLoader的子类

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



2. 父类委托机制:

jvm类加载器的父类委托机制_第2张图片

jvm类加载器的父类委托机制_第3张图片


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

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

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


4. 运行时包:

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

你可能感兴趣的:(jvm类加载器的父类委托机制)