一、什么是类的加载 在介绍类的加载机制之前,先来看看,类的加载机制在整个 java 程序运行期间处于一个什么环节,下面使用一张图来表示: 1.png 从上图可以看,java 文件通过编译器变成了.class...其实,类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM 规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class 文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误...首先看的就是类加载机制的过程。 二、类加载的过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。...下面就一个一个去分析一下这几个过程 1、加载 ”加载“是”类加机制”的第一个过程,在加载阶段,虚拟机主要完成三件事: (1)通过一个类的全限定名来获取其定义的二进制字节流 (2)将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构...,则其父 类 也 会 被 初 始 化 Java 虚 拟 机 启 动 时 被 标 明 为 启 动 类 的 类 ( JavaTest),直接使用 java.exe 命令来运行某个主类好了,到目前为止就是类加载机制的整个过程
以下哪项不属于java类加载过程?...加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定...加载 在加载阶段(可以参考java.lang.ClassLoader的loadClass()方法),虚拟机需要完成以下3件事情: 通过一个类的全限定名来获取定义此类的二进制字节流(并没有指明要从一个Class...初始化 类初始化阶段是类加载过程的最后一步,到了初始化阶段,才真正开始执行类中定义的java程序代码。...在准备极端,变量已经付过一次系统要求的初始值,而在初始化阶段,则根据程序猿通过程序制定的主管计划去初始化类变量和其他资源,或者说:初始化阶段是执行类构造器()方法的过程.
在java中,几乎所有的方法都是后期绑定的。 下面详细讲述类加载过程中每个阶段所做的工作。...加载 加载时类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情: 1、通过一个类的全限定名来获取其定义的二进制字节流。 ...加载阶段完成后,虚拟机外部的 二进制字节流就按照虚拟机所需的格式存储在方法区之中,而且在Java堆中也创建一个java.lang.Class类的对象,这样便可以通过该对象访问方法区中的这些数据。...我们把每一层上面的类加载器叫做当前层类加载器的父加载器,当然,它们之间的父子关系并不是通过继承关系来实现的,而是使用组合关系来复用父加载器中的代码。...在准备阶段,类变量已经被赋过一次系统要求的初始值,而在初始化阶段,则是根据程序员通过程序指定的主观计划去初始化类变量和其他资源,或者可以从另一个角度来表达:初始化阶段是执行类构造器()方法的过程
前言 上篇我们说到为了减少Activity类加载的过程,所以可以预创建Activity。 有的朋友就问我,类加载,类实例化到底是怎样一个过程,为什么预加载一次就能减少下次加载的时间呢?...类加载阶段 类的加载主要有三步: 将class文件字节码内容加载到内存中。 并将这些静态数据转换成方法区中的运行时数据结构。 在堆中生成一个代表这个类的java.lang.Class对象。...类加载器种类 类加载器种类主要有四种: BootstrapClassLoader:启动类加载器,使用C++实现 ExtClassLoader:扩展类加载器,使用Java实现 AppClassLoader...类加载过程(双亲委派机制) 类加载的过程可以用一句话概括: 先在方法区找class信息,有的话直接调用,没有的话则使用类加载器加载到方法区。...如果Bootstrap ClassLoader加载失败(在\lib中未找到所需类),就会让Extension ClassLoader尝试加载。
基本过程: 根据类的全限定名称加载定义类的二进制字节流。...将字节流代表的静态存储结构转化为方法区的运行时数据结构 内存中生成一个代表这个类的java.lang.Class对象,作为方法去这个类的各种数据访问入口 数组类本身不通过类加载器创建,由java...虚拟机直接创建,数组类的元素类型由类加载器加载。...符号引用:以一组符号来描述所引用的目标,任何形式的字面量,只要使用时能无歧义的定位到目标,,与虚拟机内存实现无关,无关引用目标是否加载。...直接引用:直接指向目标的指针,偏移量或间接定位到目标的句柄,和虚拟机实现的内存相关,直接引用相关的目标对象必须已加载。 。。。 初始化:开始执行类定义中的Java程序代码。
类的加载过程 类的加载过程又分为三个步骤: 过程1:类的装载(Loading) 将类的class文件读入内存,并为之创建一个java.lang.Class的实例对象,此过程由类加载器(负责类的加载,对应一个...过程2:链接(Linking) 验证(Verify):确保加载的类的信息符合JVM规范,例如:每一个class文件都以cafebabe开头,没有安全方面的问题。...准备(Prepare):正式为类中的(static)静态变量分配内存,并设置默认初始化值的阶段。这些内存都在方法区中进行分配。...解析(Resolve):虚拟机常量池内得符号引用(常量名)替换为直接引用(地址)的过程。 过程3:初始化(initialization) 执行类构造器方法的过程。...执行所有类中(static)静态变量和(static)静态代码块中的语句的赋值动作,这些操作都在方法中进行。 因为类的加载过程中还没有对象的存在,因而赋值操作也只能是对静态变量进行。
类加载过程 类的加载过程包括加载, 验证, 准备, 解析, 初始化五个阶段. 加载 加载过程实现三个事: 通过类的全限定名来获取定义此类的二进制字节流....元数据验证: 对字节码进行语义分析, 确保符合Java规范要求. 字节码验证: 对数据流和控制流分析, 确保程序语义是合法的, 符合逻辑的....符号引用验证: 对类自身以外(常量池中的各种符号引用)的信息进行校验. 准备 准备阶段为类变量分配内存并设置初始值, 使用的是方法区的内存....初始化 初始化阶段执行类构造器()方法. 在准备阶段, 类变量已经赋过一次初始值了, 而在初始化阶段, 根据程序制定的去初始化类变量和其他资源....此方法不需要显式调用父类构造器. 如果一个类中不包含类变量的赋值操作, 也不包含静态语句块, 那么编译器可以不为该类生成()方法.
前言 Java 通过引入字节码和 JVM 机制,提供了强大的跨平台能力,理解 Java 的类加载机制是深入 Java 开发的必要条件。 本篇博文的重点是,请介绍类加载过程,什么是双亲委派模型?...概述 一般来说,我们把 Java 的类加载过程分为三个主要步骤:加载、链接、初始化,具体行为在 Java 虚拟机规范里有非常详细的定义。...使用委派模型的目的是避免重复加载 Java 类型。 正文 首先,从架构角度,一起来看看 Java 8 以前各种类加载器的结构,下面是三种 Oracle JDK 内建的类加载器。...该目录也可以通过设置 “java.ext.dirs” 来覆盖。...后记 以上就是 【JAVA】聊聊类加载过程 的所有内容了; 梳理了一下类加载的过程,进行了相对全面的总结,希望对你有所帮助。
那么这篇文章我们来看一下一个 Java 类是怎么被虚拟机加载并使用的,本文内容参考了《深入理解Java机》一书。..."C:\Users\MAIBENBEN\Desktop\blog\Java常用技术\Java 类机制(2)----类加载过程" Main 命令。...\Desktop\blog\Java常用技术\Java 类机制(2)----类加载过程"。..., ...); } 所以我们能定义的便是代码注释中的 通过某种方式得到类的二进制数据过程,这也是上文介绍类加载步骤中 加载 步骤中提到的 加载哪个类数据和如何加载类数据是开发者可自定义的 过程的具体体现...,但因为启动类加载器通过 C++ 实现,Java 层没有其对象)。
通过此实例的 newInstance()方法就可以创建出该类的一个对象。 类的生命周期 我们先来看下类的生命周期,包括: 加载 连接 初始化 使用 卸载 其中加载、连接、初始化属于类加载过程。...类加载过程 JVM的类加载的过程是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由JVM的具体实现指定的。...下面我们来逐步解析 加载# 这里的加载是微观上的,是类加载过程中的一小步,也是第一步,类加载过程中的加载是宏观上的。...加载阶段我们可以用自定义类加载器去控制字节流的获取方式,是非数组类的可控性最强的阶段,而数组类型不通过类加载器创建,它由 Java 虚拟机直接创建。 关于类加载器是什么,后文再聊。...类加载器# 三大类加载器# 了解了类加载过程后,我们来看看类加载器。 类加载器(ClassLoader)用来加载 Java 类到 Java 虚拟机中。
类的加载过程 当Java程序需要使用某个类时,如果该类还未被加载到内存中,JVM会通过加载、连接(验证、准备和解析)、初始化三个步骤来对该类进行初始化。...当Java程序需要使用某个类时,如果该类还未被加载到内存中,Java虚拟机会通过加载、连接和初始化一个Java类, 使该类可以被正在运行的Java程序所使用。...通过使用不同的类加载器,可以从不同来源加载类的二进制数据,通常有如下几种来源: 从本地文件系统加载class文件; 从一个ZIP、 JAR、 CAB或者其他某种归档文件中提取Java class文件,JDBC...编程时使用到的数据库驱动就是放在JAR文件中,JVM可以直接从JAR包中加载class文件; 通过网络加载class文件,这种场景最典型的应用就是 Applet; 把一个java源文件动态编译、并执行加载...如果有了直接引用, 那引用的目标必定已经在内存中存在 类的初始化 初始化阶段是类加载过程的最后一步 , 前面的几个阶段, 除了在加载阶段用户应用程序可以通过自定 义类加载器參与之外, 其余动作完全由虚拟机主导和控制
朋友给我发了一道有意思的题目,如下 为什么用.class的方式加载类和以Class.forName()的方式加载的结果不同呢,原因很简单,就是类加载过程的不同。...这就扯到基础理解上了,就是Java是如何加载一个类的呢? 上图是我绘制的整个Java类加载过程。...首先是编译期,将Java源文件也就是敲好的代码通过编译,转换成.class文件,也就是字节码文件(byte),然后经过传输传给类加载器,传输的是刚转换好的字节码文件,也可以是通过网络传输过来的字节码文件...然后就是运行期,运行期一开始,类加载器初始化字节码文件,通过本地类库来验证字节码文件的正确性,然后交给JVM的解释器和即时编译器,最后汇合给JVM内部的Java运行系统,都ok了后传给PC的操作系统,最后就是物理硬件层面...所以问题的答案就有了 .class是JVM将类装入内存,是在编译期间实现的,而编译期间只是做了字节码转换,所以不执行静态块 而class.forName()除了将类的.class文件加载到jvm中之外
我们知道,我们写的java代码保存的格式是 .java, java文件被编译后会转换为字节码,字节码可以在任何平台通过java虚拟机来运行,这也是java能够跨平台的原因。...最近在浏览一些博客时看到一些更为详细的讲解,如java类加载全过程,该博文有一万多的点击,但感觉还是讲得不够详细,说了类的加载过程有哪些,但没有详细的展开,说了一些类初始化的细节。 ...希望大家看了之后更能理解JVM的工作原理和java类的生产过程(类加载的过程); 类从被加载到虚拟机类存中开始,到被卸载出内存为止,它的整个生命周期包括 加载 → 验证 → 准备 → 解析 → 初始化 ...→ 使用 → 卸载 7个部分、 下面我就来详细的说说每个部分的详细过程,再补充一下双亲委派模型。...再次之前我想补充一个名词解释,类加载器:虚拟机把 实现 类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流” 这个过程的代码称为类加载器 1.
最近在浏览一些博客时看到一些更为详细的讲解,如java类加载全过程,该博文有一万多的点击,但感觉还是讲得不够详细,说了类的加载过程有哪些,但没有详细的展开,说了一些类初始化的细节。 ...希望大家看了之后更能理解JVM的工作原理和java类的生产过程(类加载的过程); 类从被加载到虚拟机类存中开始,到被卸载出内存为止,它的整个生命周期包括 加载 → 验证 → 准备 → 解析 → 初始化 ...→ 使用 → 卸载 7个部分、 下面我就来详细的说说每个部分的详细过程,再补充一下双亲委派模型。...再次之前我想补充一个名词解释,类加载器:虚拟机把 实现 类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流” 这个过程的代码称为类加载器 1....5.初始化 类初始化阶段是类加载过程中的最后一步,这才是执行类中定义的java程序代码(也可以说是字节码)。
学习资料链接:https://www.bilibili.com/video/av30023103/ 链接 将JAVA类的二进制代码合并到JVM的运行状态之中的过程 1.验证: 确保加载的类信息符合JVM...3.解析: 虚拟机常量池内的符号引用替换为直接引用的过程。 初始化 1.初始化阶段实质性类构造器()方法的过程。...类加载全过程 1.类的主动引用(一定会发生类的初始化) new一个类的对象 调用类的静态成员(除了final常量)和静态方法 使用java.lang.reflect包的方法对类进行反射调用 当虚拟机启动...,java XXX,则一定会初始化XXX类,说白了就是先启动main方法所在的类 当初始化一个类,如果其父类没有被初始化,则先会初始化他的父类 2.类的被动引用(不会发生类的初始化) 当访问一个静态域时...,只有真正声明这个域的类才会被初始化 通过子类引用父类的静态变量,不会导致子类初始化 通过数组定义类引用,不会触发此类的初始化 引用常量不会触发此类的初始化(常量在编译阶段就存入调用类的常量池中了)
java类加载的过程 说明 当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过以下三个步骤对该类进行初始化。...类加载步骤 1、加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的 java.lang.Class 对象,作为方法区中类数据的访问入口。...2、链接:将Java类的二进制代码合并到JVM的运行状态之中的过程。 3、执行类构造器 () 方法的过程。...(){ m = 300; m = 100; } */ 以上就是java类加载的过程,希望对大家有所帮助。...更多Java学习指路:Java基础 本教程操作环境:windows7系统、java10版,DELL G3电脑。
上一篇:Java虚拟机--类加载时机 类加载的全过程包括:加载、验证、准备、解析和初始化。...加载: 在加载阶段,虚拟机需要完成3件事情: 通过一个类的全限定名来获取定义此类的二进制字节流; 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构; 在内存中生成一个代表这个类的Class对象...解析: 解析阶段是虚拟机将常量池中的符号引用替换为直接引用的过程。 符号引用:是以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义的定位到目标即可。...初始化: 在准备阶段,变量已经赋过一次系统要求的初始值,而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。初始化阶段是执行类构造器()方法的过程。...只要当父接口定义的变量被使用时才会执行父类()方法。 虚拟机会保证一个类的()方法在多线程下被正确的加锁、同步。
类加载过程 类加载的五个过程:加载、验证、准备、解析、初始化。 ? 加载 在加载阶段,虚拟机主要完成三件事: 通过一个类的全限定名来获取定义此类的二进制字节流。...初始化 在准备阶段,类变量已经经过一次初始化了,在这个阶段,则是通过程序制定的计划去初始化类的变量和其他资源。这些资源有static{}块,构造函数,父类的初始化等。...至于使用和卸载阶段阶段,这里不再过多说明,使用过程就是根据程序定义的行为执行,卸载由GC完成。...也可以通过System.out.println(System.getProperty("java.ext.dirs"))查看加载类文件的路径。...如果没有,那必须先执行相应的类的加载过程。 2. 对象分配内存 对象所需内存的大小在类加载完成后便完全确定(对象内存布局),为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。
注意 我们当在另一个类中引用其他类的final静态值的时候,编译器把其他类的final符号引用存储在自己类的常量池中了 发布者:全栈程序员栈长,转载请注明出处:https
文章目录 1.java类加载过程 1.1加载 1.2 链接 1.3 初始化 *说明 与方法 1.4 使用 1.5 卸载 2.被动引用和主动引用 2.1主动引用 2.1.1.遇到new、getstatic...2.1.2.使用java.lang.reflenct包的方法对类进行放射调用,如果没有进行初始化,则需要触发其初始化。...2.2.3.常量在编译阶段会存入调用类的常量池中,本质没有直接引用到定义的常量类中,因此不会触发定义的常量类初始化 2.3练习题 1.java类加载过程 重新回顾了java的类的生命周期,主要有:加载...上述过程包括了一个java类在jvm虚拟机中声明周期的全过程。 其中,加载、链接、初始化,称为类的加载过程。 而链接又包含了:验证、准备、解析等过程。见下图: ?...其实理解了类的加载过程也就不难理解,其过程如下: (1).执行链接过程,初始化所有的类变量: instance -> null x -> 0 y -> 0 (2).执行初始化过程: new
领取专属 10元无门槛券
手把手带您无忧上云