其他分享
首页 > 其他分享> > 四、类的加载篇——类的加载器

四、类的加载篇——类的加载器

作者:互联网

一、概述

1、作用

类加载器是JVM执行类加载机制的前提。

ClassLoader的作用:

ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给Java虚拟机进行链接、初始化等操作。因此,ClassLoader在整个加载Loading阶段,只能影响到类的加载,而无法通过ClassLoader去改变类的链接和初始化行为。至于它是否可以运行,则由Execution Engine决定。

2、显式加载、隐式加载

显式加载:指的是在代码中通过调用ClassLoader加载class对象,如直接使用Class.forName(name)或this.getClass().getClassLoader().loadClass()加载class对象。

隐式加载:不直接在代码中调用ClassLoader的方法加载class对象,而是通过虚拟机自动加载到内存中,如在加载某个类的class文件时,该类的class文件中引用了另外一个类的对象,此时额外引用的类将通过JVM自动加载到内存中。

3、类加载机制的必要性

一般情况下, Java开发人员并不需要在程序中显式地使用类加载器,但是了解类加载器的加载机制却显得至关重要。从以下几个方面说:

4、加载的类是唯一的吗

对于任意一个类,都需要由加载它的类加载器和这个类本身一同确认其在Java虚拟机中的唯一性。每一个类加载器,都拥有一个独立的类名称空间:比较两个类是否相等,只有在这两个类是由同一个类加载器加载的前提下才有意义。否则,即使这两个类源自同一个Class文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那这两个类就必定不相等。

5、类加载机制的基本特质

三个基本特征:

JDK也需要提供些默认的参考实现。例如,Java 中INDI、JDBC、文件系统、Cipher等很多方面,都是利用的这种机制,这种情况就不会用双亲委派模型去加载,而是利用所谓的上下文加载器。

 

二、类的加载器分类

1、分类说明

JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader) 和自定义类加载器(User-Defined ClassLoader)。

从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。

引导类加载器:启动类加载器

自定义类加载器:扩展类加载器、应用程序类加载器、用户自定义类加载器

 

除了顶层的启动类加载器外,其余的类加载器都应当有自己的“父类”加载器。

不同类加载器看似是继承(Inheritance)关系,实际上是包含关系。在下层加载器中,包含着上层加载器的引用:

2、引导类加载器

启动类加载器(引导类加载器,Bootstrap ClassLoader)

3、扩展类加载器

4、应用程序类加载器

应用程序类加载器(系统类加载器,AppClassLoader)

5、用户自定义类加载器

 

标签:java,自定义,ClassLoader,Java,class,加载
来源: https://www.cnblogs.com/shiblog/p/15896520.html