JVM类与类加载器

JVM类与类加载器是 Java 虚拟机中非常重要的概念。类是 Java 程序的基本组成单元,而类加载器是负责将类的字节码文件加载到 JVM 中的组件。

Java 虚拟机将类加载分为了三个步骤:加载、连接、初始化。其中加载阶段是由类加载器完成的,连接阶段又分为了验证、准备和解析三个步骤。

类加载器负责在运行时查找并加载类的字节码文件。JVM内置了三种类加载器:

引导类加载器(Bootstrap ClassLoader):是 JVM 的内置类加载器,主要负责加载 Java 的核心类库,如 java.lang 包等。它是所有其他类加载器的父加载器。

扩展类加载器(Extension ClassLoader):负责加载位于 $JAVA_HOME/lib/ext 目录下的 jar 包中的类。

系统类加载器(System ClassLoader):负责加载用户类路径(classpath)所指定的类,是 Java 应用程序默认的类加载器。

除了内置的类加载器外,Java 还提供了自定义类加载器的机制,允许开发人员编写自己的类加载器来加载特定的类或者 jar 包。

每个类加载器在加载类的时候,都有一个父类加载器,父加载器是一种层级结构,通过父加载器来实现类加载的委派机制。当一个类加载器收到加载请求时,它首先会把请求委托给父加载器去完成,如果父加载器无法完成加载请求,子加载器才会尝试加载。这个过程会一直持续到请求被处理或者所有的父加载器都无法加载请求。

类加载器的层次结构与委托机制,使得 Java 应用程序可以使用不同的类加载器来加载不同来源的类,从而实现了更加灵活的类加载策略。

当我们在程序中创建一个对象时,JVM会首先查找该类的Class对象,如果没有加载该类,JVM会通过类加载器将该类的字节码文件加载到内存中,并生成对应的Class对象。

举个例子,假设我们有以下代码:

MyObject obj = new MyObject();

在这段代码中,我们创建了一个MyObject对象。如果此时JVM还没有加载过MyObject类,那么JVM会按照以下步骤加载该类:
JVM会首先查找该类对应的Class对象,即MyObject.class。
如果该Class对象还没有被加载,那么JVM会请求类加载器加载该类的字节码文件。
类加载器会根据类的全限定名(MyObject)查找对应的.class文件,并读取文件内容。
类加载器将读取到的字节码文件内容转换成二进制流,并交给JVM进行解析和验证。
JVM解析和验证字节码文件,并在内存中生成该类的Class对象,同时把Class对象放入方法区中的类信息缓存中。
完成上述步骤后,JVM就可以创建MyObject对象并执行相应的代码了。