在正文开始之前先贴上一张图片吧
这就是在上课时候讲的创建一个文档在里面写上任意字符,然后将后缀改为class编译的结果。
Java虚拟机的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程。JVM的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块, 而不影响系统其他功能模块的正常运行。
举个简单的例子来说,大家都应该玩过魔兽争霸这款游戏,它的模式就很像类装载了,魔兽争霸的引擎就相当于JVM,而其中大量丰富的地图就类似于各种类文件,在我们游戏的过程中通过装载不同的地图而使我们得到的游戏体验也不尽相同。
JVM中类的装载是由ClassLoader和它的子类来实现的,在API文档中有这样的描述
引用
通常情况下,Java 虚拟机以与平台有关的方式,从本地文件系统中加载类。例如,在 UNIX 系统中,虚拟机从 CLASSPATH 环境变量定义的目录中加载类。
然而,有些类可能并非源自一个文件;它们可能源自其他来源(如网络),也可能是由应用程序构造的。defineClass 方法将一个 byte 数组转换为 Class 类的实例。这种新定义的类的实例可以使用 Class.newInstance 来创建。
类加载器所创建对象的方法和构造方法可以引用其他类。为了确定引用的类,Java 虚拟机将调用最初创建该类的类加载器的 loadClass 方法。
而想要具体了解这个类就不得不说它的几个方法了:
1.loadCass方法
引用
public Class<?> loadClass(String name)
throws ClassNotFoundException使用指定的二进制名称来加载类。此方法使用与 loadClass(String, boolean) 方法相同的方式搜索类。Java 虚拟机调用它来分析类引用。调用此方法等效于调用 loadClass(name, false)。
参数:
name - 类的二进制名称
返回:
得到的 Class 对象
抛出:
ClassNotFoundException - 如果没有找到类
引用
protected Class<?> loadClass(String name,
boolean resolve)
throws ClassNotFoundException使用指定的二进制名称来加载类。此方法的默认实现将按以下顺序搜索类:
调用 findLoadedClass(String) 来检查是否已经加载类。
在父类加载器上调用 loadClass 方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。
调用 findClass(String) 方法查找类。
如果使用上述步骤找到类,并且 resolve 标志为真,则此方法将在得到的 Class 对象上调用 resolveClass(Class) 方法。
鼓励用 ClassLoader 的子类重写 findClass(String),而不是使用此方法。
参数:
name - 类的二进制名称
resolve - 如果该参数为 true,则分析这个类
返回:
得到的 Class 对象
抛出:
ClassNotFoundException - 如果无法找到类
由API文档中的描述可知这个方法就是ClassLoader的切入点。其中name参数指定了JVM需要的类的名称,该名称以包表示法表示,如Java.lang.Object;resolve参数告诉方法是否需要解析类,在初始化类之前,应考虑类解析,并不是所有的类都需要解析,如果JVM只需要知道该类是否存在或找出该类的超类,那么就不需要解析。
由于时间关系,未完待续