当前课程知识点:JAVA程序设计进阶 > 第八章 反射与代理机制 > 8.4 Java 反射扩展-jvm加载类原理 > 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程序
会带来很大的帮助
那这一章的内容我们就介绍到这里
-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
-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
-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