当前课程知识点:JAVA程序设计进阶 >  第八章 反射与代理机制 >  8.4 Java 反射扩展-jvm加载类原理 >  Video

返回《JAVA程序设计进阶》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《JAVA程序设计进阶》慕课在线视频列表

Video课程教案、知识点、字幕

这一节我们来介绍一下

JAVA虚拟机中类加载的原理

什么叫类加载

大家想想

当我们编辑完JAVA的源程序以后

你一编译你会得到

是一大堆点class文件

那点class文件就是我们这些类文件

而这些类文件

平常是存在我们的硬盘上

也就存在我们电脑的文件系统当中

那当这些类文件需要执行的时候

就需要我们JAVA虚拟机

把它从硬盘上

给挪到我们内存当中

那整个挪到

我们JAVA虚拟机内存当中过程

实际上就是一个类加载的过程

我们先看一下JAVA虚拟机当中

它的类加载有哪些加载器

首先是JAVA虚拟机自带的

它的一些默认加载器

第一个是根类加载器叫bootstrap

它是由C++来编写的

那我们自己写JAVA程序

想去获得它是不行的

那第二个默认加载器

是扩展类的加载器

它本身是由JAVA来编写的

然后第三方面的加载器

就是我们系统类

或者应用类的加载器

本身由JAVA来编写

那大家有没有想起

我们当初刚开始学JAVA的时候

需要大家配置一下类路径

也就是(class path)

那(class path)里边会是指定了

我们的标准的这些类

是存在你的硬盘当中

是哪个目录当中

以及你自己编写应用类

是属于哪个目录当中

如果这个(class path)

你没有设定好的话

你的JAVA程序是执行不了的

那一旦你设好了以后

我们的JAVA虚拟机

就会从这些类路径当中

去加载我们的各种类

那除了刚才我们介绍的这些

JAVA虚拟机自带的

默认的加载器之外

也可以有用户自定义的类加载器

如果你要自定义的话

它本身属于JAVA点lang点

Class点Loader这个类的子类

那在这里面可以去让我们程序员

自己来去制定它类的加载的方式

对于任何一个类它都包含了

加载他的ClassLoader的一个引用

通过getClassLoader这个方法

我们就可以得到

它的类加载器的引用

如果这个方法返回值是空的话

就是表明说我们这个类的

它的加载器是根加载器bootstrap

那类在加载过程当中有哪些方式呢

第一种就是说

我们本地编译好的这些类

直接就从我们的

硬盘的文件系统当中

加载到我们内存当中了

这是一种可能的方式

应该说也是一种比较常用的方式

那对于JAVA当中类加载

还有一个很重要的特点

就是它可以通过网络来加载

我们一直说JAVA编程语言

是一个适用于网络的编程语言

或者说它本身天生

就是为了网络编程而诞生的

所以它有很重要的特点

就是可以动态加载

而且还可以从网络加载

那它网络加载的话

它可以通过我们java点net

这个包中的URLClassLoader里面

通过指定url某一个网址

就把互联网上的某一类

给它加载过来

这是我们类加载的第二种方式

第三种方式

是从我们的压缩文件当中去加载类

这个是因为我们从点jar到点zip文件

是可以把我们很多编译好的

class文件给它打包

打包成一个压缩文件

那在JAVA虚拟机

执行这些压缩文件时候

就要从这个里面去把类

加载到JAVA虚拟机当中

那这个过程它会自动解析

我们jar文件找到相应的class文件

然后去加载

那第四种加载方式

是从我们JAVA的源文件

动态编译成class文件

这也很有意思

就说我们可以在加载之前

先把源文件源代码编一下

然后成为class文件

在把它加载进来

所以这是我们类的

四种主要的加载方式

那加载的话有哪些步骤呢

第一个步骤就叫load就叫加载

这个步骤干嘛呢

就是从你的硬盘上的文件系统当中

把你的点class文件

给它装载到我们JAVA虚拟机

所在的内存当中

这是第一步

第二步要做连接

连接里面也会包括

它的一些小的步骤

第一部分是验证

注意验证主要验证说

你装载进来的这个点class文件

它是不是符合我们JAVA虚拟机

对于自解码文件的一个规范

做格式的这种校验

甚至是不是有恶意是不是有危害

这些都是我们验证的过程

那第二个小步骤是准备

准备的话也就是说

要把我们这些类

它的一些相应的静态的成员

做一下内存的分配

那第三部分的话是要解析

解析是什么

就是把我们很多的

这些符号性的引用

把它转化成一种直接的引用

所以这是连接

这个步骤当中的三个小步骤

最后的话

第三个步骤是做类的初始化

比如说我们将类的静态变量

给它做赋于正确的初始值

注意这个初始值是指的是

我们程序员

在给它定义的这个初始值

而不是说默认初始值

默认初始值这个确定是在

我们第二个步骤连接步骤里边

这个准备小步骤里边已经实现了

那类加载器的话

实际上它加载的话

也是有很多有它的顺序的

因为我们本身类加载器有好几种

那加载顺序基本是这样的

先加载通过根加载器来加载

紧接着去加载扩展类

再接着去加载我们应用类加载器

最后是用户自己定义的类加载器

当然通常情况下

我们自己很少会用

自己去定义一个类加载器

除非非常特殊的需求

那在整个加载过程当中

如果到了最后一层

都加载不了的话

那就会出现

ClassNotFoundException这种异常

那这种异常实际上它表明的说

并不是说

有时候并不是说

我们这类没有找着

而是说可能这个加载器加载出错

这也是有可能的

这完全有可能的

那整个类加载器

加载的过程是怎么样的呢

我们通过这八个步骤

来做一个简单的描述

第一

检测Class就这个类是否载入过

也就是说可能之前

我们已经从硬盘上

把这个点Class文件

已经放到我们内存当中了

如果在我们的缓存开始当中

有了这个类的话

那我们就直接

就是返回这个类就可以了

如果还没有加载

我们进入第二步

第二步的话

我们先去确认一下

我们要加载这个类它的父类的

这个加载器有没有存在

如果没有父类加载器的话

那就表明它本身就是根加载器

那我们直接跳到第四步

从根加载器当中去进行类的载入

如果有父类的加载器的话

我们就进入第三步

去把它的父类加载器

类加载器载入

载入成功的话

我们就直接返回Class了

如果不成功的话

那我们就到第五步

就去寻找这个Class文件

那Class文件

实际上寻找Class文件

实际上往往就是在

我们的Class文件很多是存在

我们硬盘的文件系统当中的

如果找着的话

那我们就进入第六步

把它这个Class文件加载进来

加载完后跳到第八步

去返回Class文件

但如果说我们在

第五步寻找Class文件的时候

没有找着点Class文件

也许可能是因为

你指定的这个Class文件路径有错误

那我们就会跳到第七步

就会抛出ClossNortFoundException

那这个类的加载就没有成功

那注意到一个很大的特点

也就说我们的这个类加载

它是一个动态的一个过程

而且可以从多个源头来去加载

你可以是从

我们硬盘上的文件系统当中去加载

也可以通过我们网络互联网

通过给定互联网的网址

来去我们把类进行加载

我们也可以从我们的压缩包当中

去加载我们的类

甚至我们可以直接

把我们的JAVA的源代码编译完后

把它加载进来

关于类加载的内容

我们这一节就介绍到这里

下面我们总结一下

今天我们这一章所讲的内容

我们今天主要讲了

三个方面的内容

第一方面是关于JAVA的反射机制

那JAVA反射机制为我们的程序员

提供了一种直接去获取我们的类

以及我们的对象它的方法

以及它的成员变量的一种方式

通过反射机制

我们可以去通过一个字符串的名字

去创建一个类的对象

并且很灵活的

去调动它的所有的方法

这是我们的反射机制

那我们今天还介绍了

JAVA的代理机制

我们介绍了静态代理和动态代理

那之所以有JAVA代理机制

是因为说我们有些情况下并不想

或者不能够去直接访问

我们的目标对象

而需要中间有一个中介的渠道

那这中介渠道的话

就可以帮助我们很好的

去控制和访问我们的目标对象

并且在访问目标的前和后

都可以增加

一些预处理或者后处理

那这里边我们介绍了

静态代理的方式

和动态代理的方式

而且动态代理方式

会给大家很大的一个方便和灵活性

那我们这章最后又介绍了

我们类的加载机制

那类的加载的话

就是要把我们

所有编译好的点Class文件

把它加载到我们的JAVA虚拟机当中

来进行运行

那这个类加载过程当中

它实际上对于JAVA

是一个动态的过程

而且是一个可以从多个源头

进行加载的这个过程

那理解的加载

类的加载过程

对于大家今后编写

更加高效有效的JAVA程序

会带来很大的帮助

那这一章的内容我们就介绍到这里

JAVA程序设计进阶课程列表:

第一章 线程(上)

-1.0 导学

--Video

-1.1 线程的基本概念

--Video

-1.1 线程的基本概念--作业

-1.2 通过Thread类创建线程

--Video

-1.2 通过Thread类创建线程--作业

-1.3 线程的休眠

--Video

-1.3 线程的休眠--作业

-1.4 Thread类详解

--Video

-1.5 通过Runnable接口创建线程

--Video

-1.5 通过Runnable接口创建线程--作业

-1.6 线程内部的数据共享

--Video

第二章 线程(中)

-2.0 导学

--Video

-2.1 线程同步的思路

--Video

-2.2 线程同步的实现方式—Synchronization

--Video

-2.3 线程的等待与唤醒

--Video

-2.4 后台进程

--Video

-2.5 线程的生命周期与死锁

--Video

-2.6 线程的调度

--Video

第三章 线程(下)

-3.0 导学

--Video

-3.1 线程安全与线程兼容与对立

--Video

-3.2 线程的安全实现-互斥同步

--Video

-3.3 线程的安全实现-非阻塞同步

--Video

-3.4 线程的安全实现-无同步方案

--Video

-3.5 锁优化

--Video

第四章 网络编程(上)

-4.0 导学

--Video

-4.1 URL对象

--Video

-4.2 URLConnection对象

--Video

-4.3 Get请求与Post请求

--Video

-4.4 Socket通信原理

--Video

-4.5 Socket通信实现

--Video

第五章 网络编程(下)

-5.0 导学

--Video

-5.1 Socket 多客户端通信实现

--Video

-5.2 数据报通信

--Video

-5.3 使用数据报进行广播通信

--Video

-5.4 网络聊天程序

--Video

第六章 Java虚拟机

-6.0 导学

--Video

-6.1 Java虚拟机概念

--Video

-6.2 Java虚拟机内存划分

--Video

-6.3 Java虚拟机类加载机制

--Video

-6.4 判断对象是否存活算法及对象引用

--Video

-6.5 分代垃圾回收

--Video

-6.6 典型的垃圾收集算法

--Video

-6.7典型的垃圾收集器

--Video

第七章 深入集合Collection

-7.0 导学

--Video

-7.1 集合框架与ArrayList

--Video

-7.2 LinkedList

--Video

-7.3 HashMap与HashTable

--Video

-7.4 TreeMap与LinkedHashMap

--Video

-7.5 HashSet

--Video

第八章 反射与代理机制

-8.0 导学

--Video

-8.1 Java反射机制

--Video

-8.2 Java静态代理

--Video

-8.3 Java动态代理

--Video

-8.4 Java 反射扩展-jvm加载类原理

--Video

-8.5 Java进阶课程总结

--Video

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。