一个java文件从被加载到被卸载这个生命过程,总共要经历5个阶段:
加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载
其中加载(除了自定义加载)+链接的过程是完全由jvm负责的,什么时候要对类进行初始化工作(加载+链接在此之前已经完成了),jvm有严格的规定(五种情况):
1.遇到new,getstatic,putstatic,invokestatic这4条字节码指令时,假如类还没进行初始化,则马上对其进行初始化工作。其实就是3种情况:用new实例化一个类时、读取或者设置类的静态字段时(不包括被final修饰的静态字段,因为他们已经被塞进常量池了)、以及执行静态方法的时候。
2.使用java.lang.reflect.*的方法对类进行反射调用的时候,如果类还没有进行过初始化,马上对其进行。
3.初始化一个类的时候,如果他的父亲还没有被初始化,则先去初始化其父亲。
4.当jvm启动时,用户需要指定一个要执行的主类(包含static void main(String[] args)的那个类),则jvm会先去初始化这个类。
5.用Class.forName(String className);来加载类的时候,也会执行初始化动作。注意:ClassLoader的loadClass(String className);方法只会加载并编译某类,并不会对其执行初始化。
以上5种预处理称为对一个类进行主动的引用,其余的其他情况,称为被动引用,都不会触发类的初始化。下面也举了些被动引用的例子:
package com.ru.jvm.loadclass; /** * 验证类加载 * @author nange * */ public class LoadClass { public static void main(String[] args) throws ClassNotFoundException { ClassLoader cl = ClassLoader.getSystemClassLoader(); //装载类 cl.loadClass("com.ru.jvm.loadclass.Tester1"); System.out.println("装载类"); //初始化类 Class.forName("com.ru.jvm.loadclass.Tester1"); // Tester test =new Tester(); // test.test(); } } class Tester1 { static{ System.out.println("初始化类"); } static String a = "111"; Tester1(){ System.out.println("构造"); } public static void main(String[] args) { System.out.println("main"); } public void test(){ System.out.println("test 方法"); } }
相关推荐
Java 类加载过程是Java虚拟机(JVM)在运行时动态加载类的机制,它涉及类的生命周期中的几个关键步骤,包括装载、连接、初始化和卸载。下面将详细阐述这些过程。 1. 装载 装载阶段是类加载的起始点,主要分为三个...
#### 二、类加载过程 类加载过程主要包括三个步骤: 1. **加载**:通过类的全限定名找到该类的二进制字节流。 2. **连接**: - **验证**:确保加载的类文件符合JVM规范,包括字节流文件的格式正确性、元数据的...
Java类加载过程是Java应用程序启动的关键步骤,它涉及到类的加载、链接以及初始化。下面将详细阐述这些步骤。 1. **加载**: 加载阶段是类加载过程的第一步,它的任务是找到类的二进制字节流,并将其加载到Java...
#### 五、类加载过程详解 类加载的过程主要分为三个阶段:加载(Loading)、连接(Linking)和初始化(Initialization)。 1. **加载**(Loading): - 类加载器查找并加载类的二进制流。 - 创建`java.lang....
例如,在提供的代码示例中,`Main`类通过`new A()`和`new B()`语句分别实例化了`A`和`B`类,这触发了类加载器对这两个类的加载过程。 #### 类加载器的层次结构 Java中的类加载器通常按照以下层次结构组织: 1. **...
Java 类加载器原理 Java 类加载器是Java虚拟机...类加载器的机制保证了Java的类加载过程是有序且安全的,同时也支持了Java的动态加载和模块化特性。在自定义类加载器时,需要遵循这些规则,以便正确地扩展JVM的功能。
Java类的加载过程可以分为以下几个步骤: 1. **加载**(Loading):找到并读取class文件的数据,将其转换成字节流,再将这些数据转化成对应的二进制数据加载到内存中。 2. **链接**(Linking): - **验证**...
**动态编译**:在热加载过程中,可能会涉及到对源代码的动态编译。`ClassUtil.java`可能包含了一些辅助方法,用于在运行时编译修改后的Java源码,然后由类加载器加载到JVM中。Java的`javac`工具或第三方库如Apache ...
Java类加载过程分为三个主要阶段:加载、链接和初始化。在加载阶段,类加载器会找到对应的.class文件并创建一个二进制数据流。链接阶段则包括验证、准备和解析三个子步骤,验证确保.class文件的正确性,准备阶段为类...
Java 类加载过程是Java程序运行时的关键环节,它涉及到如何将类的字节码加载到JVM中并准备执行。整个过程可以分为五个主要步骤:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和...
类加载过程主要包括三个阶段:加载、链接和初始化。 - **加载**:类加载器读取类文件数据并转换为二进制流加载到内存中。 - **链接**:包括验证、准备和解析三个子阶段。验证确保加载的类符合Java语言规范;准备...
在Java中,类加载过程分为加载、验证、准备、解析和初始化五个阶段。 首先,让我们了解Java中的默认类加载器体系: 1. **Bootstrap ClassLoader**:这是最基础的类加载器,由JVM自身实现,通常用于加载`<JAVA_HOME...
Java 类加载器是Java运行时环境的一个重要组成部分,它的主要职责是将编译后的字节码(.class文件)加载到JVM中,使得程序能够运行。类加载器的机制保证了类的唯一性,同时也提供了灵活性,允许我们自定义加载逻辑。...
加载阶段是类加载过程的起点,它涉及以下步骤: - **定位类文件**:JVM根据类的全限定名(包名+类名)在类路径(classpath)中找到对应的.class文件。 - **读取字节流**:将.class文件中的二进制数据读入内存,并...
Java 类加载器是Java虚拟机(JVM)的核心组成部分,它负责将...它涉及到类的查找、加载、初始化等过程,以及如何通过调整类加载器配置来优化应用性能和安全性。深入研究这些概念,能够让你在处理类加载问题时游刃有余。
Java虚拟机(JVM)的类加载过程是Java程序运行的基础,它涉及到类加载器、类的生命周期和一系列复杂的步骤。在这个过程中,类加载器主要任务是根据类的全限定名加载二进制字节流并转化为`java.lang.Class`对象。整个...
当遇到`java.lang.ClassNotFoundException`异常时,通常是因为类加载过程出现了问题。了解类加载机制对于解决这类问题至关重要,同时也有助于深入理解Java虚拟机(JVM)的工作原理。 Java 类加载机制主要由类加载器...
Java 类加载原理是Java运行时环境中的核心机制之一,它涉及到类的生命周期、类加载器的层次结构以及类的查找和加载过程。了解这一机制对于深入理解Java平台的工作原理至关重要,尤其是在开发自定义类加载器或者处理...
值得注意的是,接口的加载过程与类加载过程稍有不同。接口在初始化时,并不要求其父接口全部都完成了初始化,只有在真正使用到父接口的时候(如引用接口中定义的常量)才会初始化。 ##### 1.2 类加载的过程 类加载...