0%

Java-类的加载

类的加载过程:

Java 类的加载器

Java 类的加载器是 Java 虚拟机(JVM)的一个重要组成部分,它负责将 Java 类文件加载到内存中,并将其转换为 Java 类对象。Java 类加载器主要有以下三种类型:

Bootstrap ClassLoader(引导类加载器):也称为根加载器,是 Java 虚拟机内置的类加载器,负责加载 Java 运行时环境所需的基础类,如 java.lang 包中的类。

Extension ClassLoader(扩展类加载器):负责加载 Java 运行时环境的扩展类,即位于 jre/lib/ext 目录下的类。

System ClassLoader(系统类加载器):也称为应用程序类加载器,负责加载应用程序类路径(Classpath)下的类。

此外,还有一种特殊的类加载器:用户自定义类加载器。这种类加载器是由开发人员自己实现的,可以用来加载一些特殊的类或者是自定义的类,例如动态加载类、热部署、插件化等。用户自定义类加载器需要继承自 java.lang.ClassLoader 类,并重写父类中的 findClass() 方法来实现类的加载。

Java 类加载器的作用是实现类的动态加载,这使得 Java 应用程序可以在运行时动态地加载一些类或者资源。通过类加载器,Java 应用程序可以实现一些特殊的功能,例如模块化编程、插件化架构、代码热替换等。同时,类加载器还能够保证类的安全性,避免因为恶意代码或者不良代码的加载而导致的安全漏洞。

java虚拟机是如何加载类

假设有一个类 MyClass,该类的源代码位于 MyClass.java 文件中。当 Java 应用程序运行时,它需要将该类加载到内存中,并创建该类的实例。

加载:Java 应用程序首先需要加载 MyClass 的二进制数据。Java 虚拟机根据类的全限定名 com.example.MyClass 来查找并加载该类的二进制数据,例如 com/example/MyClass.class 文件。

验证:Java 虚拟机会对 MyClass 类的字节码进行验证,以确保它符合 Java 虚拟机规范。

准备:在验证通过后,Java 虚拟机为 MyClass 类的静态变量分配内存,并设置默认值,例如将整型静态变量赋值为 0。

解析:Java 虚拟机将 MyClass 类的符号引用(例如类名)转换为直接引用(例如内存地址),以便于执行代码时访问类的方法和属性。

初始化:最后,Java 虚拟机执行 MyClass 类的静态初始化代码,例如赋初始值给静态变量。

在加载 MyClass 类的过程中,Java 类加载器起到了关键的作用。如果 MyClass 类位于应用程序类路径下,则由系统类加载器加载;如果该类位于扩展路径下,则由扩展类加载器加载;如果该类是 Java 运行时环境的基础类,则由引导类加载器加载。

总之,Java 应用程序的类加载过程是一个动态的过程,Java 类加载器负责将类加载到内存中,Java 虚拟机负责验证、准备、解析和初始化类,最终创建该类的实例。

什么是java虚拟机的规范

Java 虚拟机规范(Java Virtual Machine Specification)是一份由 Oracle 公司发布的文档,描述了 Java 虚拟机(JVM)的实现规范和行为规范,包括:

1
2
3
4
5
6
JVM 的内部结构和运行机制。
JVM 支持的数据类型和指令集。
Java 字节码的格式和语义。
类加载器的机制和类加载的过程。
Java 虚拟机的执行引擎和垃圾回收机制。
Java 虚拟机规范的主要作用是为 Java 语言的跨平台特性提供了支持。由于 Java 虚拟机规范定义了 Java 字节码的格式和语义,以及虚拟机的内部结构和运行机制,因此只要编译出的 Java 代码符合 Java 字节码的规范,就可以在任何支持 Java 虚拟机规范的平台上运行。

同时,Java 虚拟机规范还为 JVM 的实现提供了一些指导性的建议,使得不同的 JVM 实现可以保证在一定程度上的互操作性,也便于开发者对 JVM 进行优化和调试。

Java 虚拟机规范是 Java 平台的核心技术之一,它不仅为 Java 语言的跨平台特性提供了支持,也为 Java 生态系统的发展