什么是类加载 虚拟机把描述类的数据从Class(Class文件或者网络或者其他地方,其实都是一串二进制流)加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。...使用java.lang.reflect包的方法进行反射调用的时候,如果类没有初始化,则必须先初始化 初始化一个类的时候,如果父类没有被初始化(只有类的父类,接口的父类不会),则需要先初始化父类 JVM启动时首先初始化主类...java.lang.Class对象,作为方法区(元数据区)这个类的各种数据的访问入口 二进制字节流的来源可以是(但不仅仅是): Class文件 Zip包(也就是我们经常使用的JAR包、WAR包) 网络...非数组类的加载需要通过类加载器实现,既可以使用系统的提供的引导类加载,也可以使用用户自定义的类加载器去完成,关于类加载器后续我会单独写一篇文章来介绍,并且实现我们自己的一个类加载器。...对于数组类来说,数组类是由Java虚拟机直接创建的,但是数组中的元素类型需要通过类加载器加载。数组类的可见性与数组中元素的可见性一致,如果元素不是引用类型,数组类的可见性将默认为public。
一、什么是类的加载 在介绍类的加载机制之前,先来看看,类的加载机制在整个 java 程序运行期间处于一个什么环节,下面使用一张图来表示: 从上图可以看,java 文件通过编译器变成了.class 文件,...,则其父 类 也 会 被 初 始 化 Java 虚 拟 机 启 动 时 被 标 明 为 启 动 类 的 类 ( JavaTest),直接使用 java.exe 命令来运行某个主类好了,到目前为止就是类加载机制的整个过程...我们看到 java为我们提供了三个类加载器,应用程序都是由这三种类加载器互相配合进行加载的,如果有必要,我们还可以加入自定义的类加载器。这三种类加载器的加载顺序是什么呢?...(例子不好,理解就好) 采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个...** 4、自定义类加载器 在这一部分第一小节中,我们提到了 java 系统为我们提供的三种类加载器,还给出了他们的层次关系图,最下面就是自定义类加载器,那么我们如何自己定义 类加载器呢?
在沙箱组件中包括类装载器结构,类加载器体系结构也是java沙箱的第一道防线,因为程序都是通过类加载器才能够加载到JVM中的。 类加载器有三方面的作用: 1. 它防止了恶意代码去干涉善意代码 2....用一个图形表示就是: 引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自java.lang.ClassLoader。... 扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。... 系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。...关于java类加载机制推荐大家看这篇文章《深入探讨 Java 类加载器》,IBM文档,写的很详细。
本文选自《揭秘Java虚拟机:JVM设计原理与实现》 类加载——镜像类与静态字段 类加载的最终结果便是在JVM的方法区创建一个与Java类对等的instanceKlass实例对象,但是在JVM创建完instanceKlass...以上便是一个Java类加载的核心流程。了解了类加载的核心流程之后,也许聪明的你会忍不住想,Java类的加载到底何时才会被触发呢?...Java主类的加载由JVM自动触发——JVM执行完自身的若干初始化逻辑之后,第一个加载的便是Java程序的主类。总体上而言,Java主类加载的链路如下: ?...Java程序主类的类加载器默认是系统加载器,该加载器是JDK类库中定义的sun.misc.AppClassLoader,关于该加载器的细节会在后文详述。JVM体系中加载器的继承关系如下图所示。 ?...(String)接口的入参,系统加载器据此加载目标Java类。
以下哪项不属于java类加载过程?...A.生成java.lang.Class对象 B.int类型对象成员变量赋予默认值 C.执行static块代码 D.类方法解析 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载...加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定...加载 在加载阶段(可以参考java.lang.ClassLoader的loadClass()方法),虚拟机需要完成以下3件事情: 通过一个类的全限定名来获取定义此类的二进制字节流(并没有指明要从一个Class...初始化 类初始化阶段是类加载过程的最后一步,到了初始化阶段,才真正开始执行类中定义的java程序代码。
一、什么是类的加载 在介绍类的加载机制之前,先来看看,类的加载机制在整个 java 程序运行期间处于一个什么环节,下面使用一张图来表示: 1.png 从上图可以看,java 文件通过编译器变成了.class...,则其父 类 也 会 被 初 始 化 Java 虚 拟 机 启 动 时 被 标 明 为 启 动 类 的 类 ( JavaTest),直接使用 java.exe 命令来运行某个主类好了,到目前为止就是类加载机制的整个过程...我们看到 java为我们提供了三个类加载器,应用程序都是由这三种类加载器互相配合进行加载的,如果有必要,我们还可以加入自定义的类加载器。这三种类加载器的加载顺序是什么呢?...(例子不好,理解就好) 采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个...** 4、自定义类加载器 在这一部分第一小节中,我们提到了 java 系统为我们提供的三种类加载器,还给出了他们的层次关系图,最下面就是自定义类加载器,那么我们如何自己定义 类加载器呢?
类加载机制 JVM类加载机制分为五个部分: 加载,验证,准备,解析,初始化 加载 加载是类加载过程中的一个阶段,会在内存中生成一个代表这个类的java.lang.Class 对象,作为方法区这个类的各种数据的入口...初始化 初始化阶段是类加载的最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自定义类加载器之外,其他操作都有JVM主导 到了初始化阶段,才开始真正执行类中定义的java程序代码 初始化阶段是 执行类构造器...什么时候触发类加载 什么情况需要开始类加载过程的第一阶段(加载)呢? Java虚拟机规范中并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。...扩展类加载器(Extension ClassLoader) 负责加载 JAVA_HOME\lib\ext 目录中的,或通过 java.ext.dirs 系统变量指定路径中的类 库。...应用程序类加载器(Application ClassLoader) 负责加载用户路径(classpath)上的类库 双亲委派 JVM通过 双亲委派模型进行类的加载,我们也可以通过继承 java.lang.ClassLoader
双亲委派 所谓的双亲委派,则是先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。...双亲委派 双亲委派机制的优势:采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader...其次是考虑到安全因素,java核心api中定义类型不会被随意替换。...假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的...java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。
各个步骤的主要工作如下: 加载:一个规则,就是需要把.java文件如何变成.class文件。...这个规则就是在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区访问这些数据的访问入口。 验证:验证字节流是否符合Class文件格式的规范。...答:当某个类加载器在接到加载类的请求时,会将加载任务委托给父类加载器,依次递归,父类加载器可以完成类加载任务,就成功返回;不能加载则子类加载器自己完成加载。...有3类加载器: 启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用程序类加载器(Application ClassLoader...意义:双亲委派避免类的重复加载问题,以及避免Java核心的API被篡改,保证了代码安全。
转自 【java 类加载的深入研究1】loadClass()的研究,IBM深入探讨 Java 类加载器 类加载器基本概念 顾名思义,类加载器(class loader)用来加载 Java 类到 Java...一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。...类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。...在介绍代理模式背后的动机之前,首先需要说明一下 Java 虚拟机是如何判定两个 Java 类是相同的。Java 虚拟机不仅要看类的全名是否相同,还要看加载此类的类加载器是否一样。...两个不同的类加载器 ClassLoaderA和 ClassLoaderB分别读取了这个 Sample.class文件,并定义出两个 java.lang.Class类的实例来表示这个类。
文章目录 类加载过程 加载(Load) 连接 初始化 类加载器是如何定位到具体的类文件并读取的?...在加载类时,使用双亲委派模型(朔源委派加载模型) Java的类加载器是一个运行时核心基础设施模块,主要在启动之初进行类的Load Link Init,即加载 连接 初始化 类加载是一个将.class字节码文件实例化成...加载(Load) 第一步,Load阶段读取类文件产生二进制流,并转化为特定的数据结构,初步校验cafe babe 魔法数,常量池,文件长度,是否有父类等,然后创建对应类的java.lang.Class实例...Bootstrap ClassLoader 最高一层是家族中威望最高的Bootstrap,他是JVM启动时创建的,通常有与操作系统相关的本地代码实现,是最根基的类加载器,负责装载最核心的Java类,比如...第二,第三层类加载器为Java语言实现,用户也可以自定义类加载器。 类加载规则 低层次的当前类加载器,不能覆盖更高层类加载器已经加载的类.
参考链接: C++和Java中的Foreach 要想搞清楚这两个方法的区别,我们需要了解一下Class的加载过程。...Class的加载过程分为三步: loading(装载)linking(链接)initializing(初始化) 大家可以通过这篇文章:Java魔法堂:类加载机制入了个门来了解类的详细加载过程。...(初始化),该参数在’Class.forName(String className)方法中默认值为true`,因此在类加载的过程中会初始化类的相关信息,比如类中的静态块会被执行。...原因是类加载过程中的缓存机制,由于方法1已经加载了该类,因此方法3不会再次加载该类,所以没有输出flag值,为了测试缓存的问题,我们将方法1与方法3的位置互换,程序的执行结果如下,可以看到方法3加载了该类...我们每次修改完代码都需要重启JVM来执行新的代码也是由类加载的缓存机制造成的。
什么是类加载器 通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。...它负责将JRE/lib/ext或者由系统变量java.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。...Java虚拟机的第一个类加载器是Bootstrap,这个加载器很特殊,它不是Java类,因此它不需要被别人加载,它嵌套在Java虚拟机内核里面,也就是JVM启动的时候Bootstrap就已经启动,它是用...当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢? 首先当前线程的类加载器去加载线程中的第一个类(假设为类A)。 如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器去加载类B。...比如String.class,每次加载都委托给父 类加载器,最终都是BootstrapClassLoader,都保证java核心类都是BootstrapClassLoader加载的,保证了java的安全与稳定性
2.为静态[变量]赋值,访问静态变量 3.调用静态方法 4.使用反射方法创建某个类或接口的反射方法java.lang.Class 5.初始化某子类...6.通过java.exe调用类的方法时 类加载器 根类加载器 扩展类加载器 系统类加载 其他加载方式都是属于被动加载...类加载器之间严格遵守父委托机制 Bootsrap 根加载器 主要负责核心类库的加载,例如java.lang 包加载 扩展类加载器 扩展类加载器的父类是根加载器,主要用于加载java_home 下的jre...\lib\ext里面的类库,java实现,可以将自己实现的类打包放到下面加载....系统类加载器 负责加载classpath下的类库资源 双亲委托机制 当一个类加载器调用loadclass之后,它并不会直接将其进行加载,而是先交给当前类加载器的父加载器尝试加载直到最顶层的父加载器,然后再依次向下进行加载
2.1 加载: 类加载指的是将class文件读入内存,并为之创建一个java.lang.Class 对象,即程序中使用的任何类时,系统都会为之建立一个java.lang.Class 对象。...类加载器及加载机制 java.lang.Object |__java.lang.ClassLoader 类加载器负责将class文件读入内存并为之生成对应的java.lang.Class...Java类加载器可分为三种: 根(又叫启动,引导)类加载器(Bootstrap Class-Loader) 它负责加载Java核心类(比如String,System类)。...JAVA9的改变 ? changed 可见,在JDK 9中,应用程序类加载器可以委托给平台类加载器以及引导类加载器;平台类加载器可以委托给引导类加载器和应用程序类加载器。...在JDK 9之前,扩展类加载器和应用程序类加载器都是java.net.URLClassLoader类的一个实例。
Java的程序要运行需要将编译好的class文件加载到JVM运行时数据区。 ? 在了解类的加载机制之前,我们需要了解一下类的生命周期。...类加载器 Java类的加载需要用到类加载器。类加载器负责装入类,搜索网络,jar,zip,文件夹,二进制数据,内存等指定位置的资源。...一个Java程序运行,至少有3个不同的类加载器实例,负责加载不同的类。...通过JDK提供的API:java.lang.Class.getClassLoader() 可以进行类加载器的查看,该API会返回装载类的类加载器,如果这个类是由Bootstrap ClassLoader...双亲委派模型 Java中的类并不会重复加载,同一类加载器,同一类名,代表的是同一个类。而避免类重复加载的主要原因在于JVM在加载类时默认采用的是双亲委派模型。
说到加载,不得不提到类加载器,下面就具体讲述下类加载器。 类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类的加载阶段。...对于任意一个类,都需要由它的类加载器和这个类本身一同确定其在就Java虚拟机中的唯一性,也就是说,即使两个类来源于同一个Class文件,只要加载它们的类加载器不同,那这两个类就必定不相等。...所有其他的类加载器:这些类加载器都由Java语言实现,独立于虚拟机之外,并且全部继承自抽象类java.lang.ClassLoader,这些类加载器需要由启动类加载器加载到内存中之后才能去加载其他的类。...*开头的类均被Bootstrap ClassLoader加载)。启动类加载器是无法被Java程序直接引用的。...使用双亲委派模型来组织类加载器之间的关系,有一个很明显的好处,就是Java类随着它的类加载器(说白了,就是它所在的目录)一起具备了一种带有优先级的层次关系,这对于保证Java程序的稳定运作很重要。
朋友给我发了一道有意思的题目,如下 为什么用.class的方式加载类和以Class.forName()的方式加载的结果不同呢,原因很简单,就是类加载过程的不同。...这就扯到基础理解上了,就是Java是如何加载一个类的呢? 上图是我绘制的整个Java类加载过程。...首先是编译期,将Java源文件也就是敲好的代码通过编译,转换成.class文件,也就是字节码文件(byte),然后经过传输传给类加载器,传输的是刚转换好的字节码文件,也可以是通过网络传输过来的字节码文件...然后就是运行期,运行期一开始,类加载器初始化字节码文件,通过本地类库来验证字节码文件的正确性,然后交给JVM的解释器和即时编译器,最后汇合给JVM内部的Java运行系统,都ok了后传给PC的操作系统,最后就是物理硬件层面...所以问题的答案就有了 .class是JVM将类装入内存,是在编译期间实现的,而编译期间只是做了字节码转换,所以不执行静态块 而class.forName()除了将类的.class文件加载到jvm中之外
加载作为类加载的第一个阶段,是开放的,它允许Java程序员通过自定义的类加载器去加载特定的类。 对于任意一个Java类,都需要加载它的类加载器和这个类本身确定唯一性。...启动类加载器不能被Java程序直接引用。 除了启动类加载器,其他加载器均由Java语言实现,独立于JVM。...1.2 扩展类加载器 扩展类加载器由sun.misc.Lanuncher$ExtClassLoader类实现,负责加载/lib/ext目录或被系统变量java.ext.dirs所指定的路径中的所有类库...这种机制的好处就是:假设有人恶意编写了一个和Java类包名类名一模一样的类(这里假设是java.lang.Object),由于类的加载请求会被传递到启动类加载器中尝试加载,当启动类加载器尝试加载的时候实际是加载的在.../lib的中的java.lang.Object,因此这个恶意的类永远不会被加载,双亲委派模型一定程度上保证了Java程序的安全运行。
Java类加载机制 类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类...实现这个动作的代码模块称为“类加载器”。 类加载器可以说是Java语言的一项创新,也是Java语言流行的重要原因之一,它最初是为了满足Java Applet的需求而开发出来的。...类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类加载阶段。...从Java开发人员的角度来看, 类加载器还可以划分得更细致一些, 绝大部分Java程序都会使用到以下3种系统提供的类加载器。...启动类加载器无法被Java程序直接引用。
领取专属 10元无门槛券
手把手带您无忧上云