1. 什么是 Java 类加载器
首先类加载器是一个对象,是 java.lang.ClassLoader
类的实例。类加载器用于将 Java 类加载到 JVM 中。它会根据类的名称,找到或者生成对应的字节代码,然后从这些字节代码中定义出一个 Java 类,即 JVM 中的 java.lang.Class
类的一个实例 。类加载器使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器最初是为了满足 Java Applet 远程下载 Java 类文件到浏览器中执行而开发出来的。
2. 虚拟机的类加载机制
虚拟机把类的元数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型。
3. Java 动态特性的基础
在 Java 中类型的加载、连接和初始化过程都是在程序运行期完成的。
应用:
- 如果编写一个面向接口的应用程序,可以等到运行时再指定其实际的实现类。
- 用户可以通过 Java 预定义的和自定义类加载器,让一个本地的应用程序可以在运行时从网络或其他地方加载一个二进制流作为程序代码的一部分。
4. Java 字节码的存在形式
Java 字节码可以以类文件的形式存在于磁盘上(.class),也可以通过网络的方式下载,或只存在于内存中。
5. Java 字节代码和类在 JVM 中的表现形式
在 JVM 中,Java 字节代码的表现形式是字节数组(byte[]
),Java 类的表现形式是 java.lang.Class
类的对象。
6. 类的生命周期
一般情况下:
加载 -> 验证 -> 准备-> 解析 -> 初始化 -> 使用 -> 卸载
其中,验证、准备和解析属于连接。
解析阶段可以在初始化结束后开始,为了支持 Java 语言的运行时绑定。
7. Java 对象生成的过程
Java 源程序(.java 文件)在经过 Java 编译器编译之后被转换为 Java 字节代码(.class 文件)。类加载器读取 Java 字节代码并转换为 java.lang.Class
类的一个实例。每个这样的实例就是一个 Java 类。调用实例的 newInstance()
方法就可以创建出该类的一个对象。
8. Java 类加载器的类别
- 系统提供的类加载器
- 引导类加载器(bootstrap class loader):用来加载 Java 的核心库,是用原生代码实现,不继承自
java.lang.ClassLoader
。 - 扩展类加载器(extensions class loader):用来加载 Java 扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
- 系统类加载器(system class loader):根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。Java 程序的的类基本都是由它来完成加载的。
- 引导类加载器(bootstrap class loader):用来加载 Java 的核心库,是用原生代码实现,不继承自
- 用户自定义的类加载器:开发者通过继承
java.lang.ClassLoader
类来自定义类加载器。
9. 类加载器的继承关系
除了引导类加载器,所有的类加载器都有父类加载器。
箭头方向为父类方向:
用户自定义的类加载器 -> 系统类加载器 -> 扩展类加载器 -> 引导类加载器
10. JVM 如何判断两个类是否相同
首先判断类名是否相同,然后判断加载该类的类加载器是否相同。
网友评论