首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入理解Java类加载机制-初始化

类加载的最后一个阶段是初始化阶段,初始化阶段从代码层面上看是真正执行源码的阶段。...初始化阶段主要是执行类构造方法,并不是由用户编写代码生成,而是编译器在编译源码过程中自动收集类中的类变量和static代码块生成,编译器收集的顺序由类变量和static代码块在源文件中定义的顺序决定。...static语句块中的只能访问到在他之前定义的类变量,定义在他之后的类变量,可以对其赋值,但是不能访问。 类的方法不需要显示调用父类的方法,虚拟机会保证在子类的之前,父类的方法已经执行完成。...因此在虚拟机中第一个被执行的肯定是java.lang.Object的方法。 接口的与类的方法也略为不同,接口的不会主动触发父接口的方法,除非该接口有使用到父接口的变量,父接口才会初始化。...同一个类加载器下,一个类只会被初始化一次。 本期类加载的初始化阶段就介绍到这,下期我们会讲解前面多次提及过的类加载器,我们下期再见!!!

23710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java类的加载方式、类的初始化、类的执行方式

    我们可以利用类加载器,实现类的动态加载。 class的装载包括3个步骤:加载(loading),连接(link),初始化(initialize) ?...1是静态加载、2、3是动态加载 异常(exception) 静态加载的时候如果在运行环境中找不到要初始化的类,抛出的是NoClassDefFoundError,它在JAVA的异常体系中是一个Error;...动态态加载的时候如果在运行环境中找不到要初始化的类,抛出的是ClassNotFoundException,它在JAVA的异常体系中是一个checked异常。...初始化:只有在使用时类才会被初始化。...,父类也会初始化 6 虚拟机启动时被标明是启动类的类(java Test),直接用java.exe运行某个类; 程序执行结束的几种方式: 1 system.exit(); 2 正常执行完毕; 3

    1.2K00

    Java类加载-加载

    什么是类加载 虚拟机把描述类的数据从Class(Class文件或者网络或者其他地方,其实都是一串二进制流)加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。...JVM并没有对什么时候开启加载阶段进行强制约束,但是对于初始化阶段严格规定了有且只有5种情况必须立即对类进行初始化: 遇到new(new关键字实例化对象)、getstatic(读取一个类的静态字段(被final...使用java.lang.reflect包的方法进行反射调用的时候,如果类没有初始化,则必须先初始化 初始化一个类的时候,如果父类没有被初始化(只有类的父类,接口的父类不会),则需要先初始化父类 JVM启动时首先初始化主类...如果一个java.lang.invoke.MethodHandle实例的最后解析结果是REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,如果方法句柄所对应的类没有进行过初始化...对于数组类来说,数组类是由Java虚拟机直接创建的,但是数组中的元素类型需要通过类加载器加载。数组类的可见性与数组中元素的可见性一致,如果元素不是引用类型,数组类的可见性将默认为public。

    1.3K40

    java类加载和初始化_java静态变量什么时候初始化

    目录 一、类的加载与ClassLoader的理解 1、加载 2、链接 3、初始化 二、什么时候会发生类初始化 1、类的主动引用(一定会发生类的初始化) 2、类的被动调用(不会发生类的初始化) 三、类加载器的作用...四、动态创建对象执行方法 一、类的加载与ClassLoader的理解 1、加载 将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.class...二、什么时候会发生类初始化 1、类的主动引用(一定会发生类的初始化) 当虚拟机启动,先初始化main方法所在的类; new一个类的对象; 调用类的静态成员(除了final常量)和静态方法; 使用java.lang.reflect...如:当通过子类引用父类的静态变量,不会导致子类初始化; 通过数组定义类引用,不会触发此类的初始化; 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了); 三、类加载器的作用 将class...文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。

    50420

    【Java 虚拟机原理】Java 类中的类加载初始化细节 ( 只使用类中的常量时加载类不会执行到 ‘初始化‘ 阶段 )

    文章目录 一、类加载初始化时机 二、常量加载示例 三、数组加载示例 一、类加载初始化时机 ---- 类加载时机 : Java 程序执行时 , 并不是一开始将所有的字节码文件都加载到内存中 , 而是用到时才进行加载...main 函数的类 , 会默认自动加载 ; 调用子类 , 如果之前没有加载过父类 , 则 自动加载父类 ; 访问 类 的 静态变量 有些类加载操作 , 不需要执行 加载 -> 连接 ( 验证 , 准备...加载 -> 连接 ( 验证 , 准备 , 解析 ) 阶段 , 就可以完成常量池的初始化 , 即使没有执行 初始化 这个步骤 , 也不影响使用类中的常量值 ; 在 连接 的 准备 阶段 , 为 普通 的...如创建了一个对象数组 , 此时不会加载该对象对应的类 , 只会为其在内存分配空间 ; 创建数组时 , 触发的是 Student[] 数组类型的 类加载初始化 , 但是不会触发 Student 类的初始化操作...int age = 18; static { // 加载类的 " 初始化 " 阶段才执行 静态代码块 // 如果只是进行了 " 连接 " , 没有进行 初始化

    3.6K20

    JAVA类加载

    一、什么是类的加载 在介绍类的加载机制之前,先来看看,类的加载机制在整个 java 程序运行期间处于一个什么环节,下面使用一张图来表示: 从上图可以看,java 文件通过编译器变成了.class 文件,...解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符 7 类符号引用进行。 5、初始化 这是类加载机制的最后一步,在这个阶段,java 程序代码才开始真正执行。...在 Java 中对类变量进行初始值设定有两种方式: ①声明类变量是指定初始值 ②使用静态代码块为类变量指定初始值 JVM 初始化步骤 1、假如这个类还没有被加载和连接,则程序先加载并连接该类...,则其父 类 也 会 被 初 始 化 Java 虚 拟 机 启 动 时 被 标 明 为 启 动 类 的 类 ( JavaTest),直接使用 java.exe 命令来运行某个主类好了,到目前为止就是类加载机制的整个过程...我们看到 java为我们提供了三个类加载器,应用程序都是由这三种类加载器互相配合进行加载的,如果有必要,我们还可以加入自定义的类加载器。这三种类加载器的加载顺序是什么呢?

    1.1K75

    技术转载——详解Java 类的加载、连接和初始化

    系统可能在第一次使用某个类时加载该类,也可能采用预加载机制来加载某个类。本节将会详细介绍类加载、连接和初始化过程中的每个细节。...类的加载 当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化三个步骤来对该类进行初始化。...类加载指的是将类的 class 文件读入内存,并为之创建一个 java.lang.Class 对象,也就是说,当程序中使用任何类时,系统都会为之建立一个 java.lang.Class 对象。...通过网络加载 class 文件。 把一个 Java 源文件动态编译,并执行加载。 类加载器通常无须等到“首次使用”该类时才加载该类,Java 虚拟机规范允许系统预先加载某些类。...初始化某个类的子类。当初始化某个类的子类时,该子类的所有父类都会被初始化。 直接使用 java.exe 命令来运行某个主类。当运行某个主类时,程序会先初始化该主类。

    43620

    【Android 逆向】类加载器 ClassLoader ( 类加载时机 | 隐式加载 | 显示加载 | 类加载步骤 | 装载 | 链接 | 初始化 )

    文章目录 一、类加载时机 1、隐式加载 2、显式加载 二、类加载步骤 一、类加载时机 ---- 1、隐式加载 类加载 的 隐式加载 , 没有明确的说明加载某个类 , 但是进行了如下操作 : 使用 new...操作 都会触发 隐式加载 ; 访问 类的 静态函数 ; 2、显式加载 显式加载 : 明确的说明要加载某个类 , 使用 Class.forName() 加载指定的类 ; 使用 ClassLoader.loadClass...加载指令的类 ; 二、类加载步骤 ---- 参考 【Java 虚拟机原理】Java 类加载过程 ( 加载 | 连接 - 验证 准备 解析 | 初始化 | 使用 | 卸载 ) 博客 ; 类加载步骤 :...① 装载 : 加载某个类时 , 首先要 查找 并 导入 Class 字节码文件 ; ② 链接 : 该阶段 , 可以分为以下 3 个子阶段 ; 验证 : 验证字节码文件是否正确 ; 准备 :...为 静态变量 划分内存空间 , 并进行默认值赋值 ; 解析 : 将 " 常量池 " 中的 " 符号引用 " 转为 " 直接引用 " ; ③ 初始化 : 调用 clinit 函数 , 初始化 静态变量 静态代码块

    2.2K30

    Java学习笔记-全栈-Java基础-04-内存分析、类初始化与类加载

    3.JVM会保证类构造器()在多线程中被正确加锁和同步 4.当访问一个Java类的静态域时,只有真正声明这个域的类才会被初始化 对于初始化的解释 初始化的过程非常重要,需要明确其中的每一步...parent 代码分析 我在parent中加了一个静态变量string,然后在main中使用Son指向string,根据4.当访问一个Java类的静态域时,只有真正声明这个域的类才会被初始化,只有父类会被初始化...java Test ,则Test类一定会被初始化 继承树回溯初始化,当父类没有被初始化时,优先初始化父类。...实现 应用程序类加载器(application) 根据类路径(classpath, java.class.path)加载,一般的应用类都由其完成加载。...Java.class.ClassLoader类 作用: 根据指定类名称,找到或生成对应的字节码,然后从这些字节码中定义出一个Java实例。 负责加载Java应用所需资源,如配置文件、图像文件等。

    39720

    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文档,写的很详细。

    1K10

    【Java 虚拟机原理】Java 类加载过程 ( 加载 | 连接 - 验证 准备 解析 | 初始化 | 使用 | 卸载 )

    文章目录 一、Java 类加载过程 0、字节码编译 1、加载 2、连接 3、初始化 总结 一、Java 类加载过程 ---- 0、字节码编译 编写好 Java 源码 Student.java , 使用...javac 将上述 Java 源码编译成 Class 字节码文件 Student.class , 1、加载 加载 : 通过 " 类加载子系统 " 将该字节码文件 , 加载到 Java 虚拟机内存中 的...方法区 , 然后开始执行 " 连接 " 操作 , 类加载时机 : Java 程序执行时 , 并不是一开始将所有的字节码文件都加载到内存中 , 而是用到时才进行加载 ; 通过 new 关键字创建实例对象...章节中的 Java 源码 , Class 字节码 , 字节码附加信息 ; ) 3、初始化 初始化 : 对变量进行 指定赋值 ; 如 : 有静态变量 static int a = 5 , 在 连接...过程中的 准备 阶段 , 为该变量赋值默认值 0 ; 在 初始化 阶段 , 为其赋值 代码 中设置的真正的 指定初始值 5 ; ---- 总结 借助下图理解类加载过程 ;

    52710

    深入解析java虚拟机:详细类可用机制,类加载、链接、初始化

    类的加载 类加载过程先于虚拟机的绝大部分组件的加载过程,具体会在第4章讲解。虚拟机初始化完成后做的第一件事情就是加载用户指定的主类。...双亲委派加载模型避免了类被重复加载,而且保证了诸如java.lang.Object、java.lang.Thread等核心类只能被Bootstrap类加载器加载。...类的初始化 类可用三部曲的最后一步是类初始化。《Java虚拟机规范》的第5章对初始化流程有非常详尽的描述,指出整个类的初始化流程有12步。 1)获取类C的初始化锁LC。...类的重定义 加载、链接、初始化是标准的类可用机制,除此之外,Java提供了一个用于特殊场景的类重定义功能,由JDK 5引入的 java.lang.instrument.Instrumentation实现...本文给大家讲解的内容是深入解析java虚拟机:详细类可用机制,类的加载、链接、初始化 下篇文章给大家讲解的是探讨Java对象和类在HotSpot VM内部的具体实现; 觉得文章不错的朋友可以转发此文关注小编

    80730

    二、类加载器与类初始化深度剖析

    3 ,改成 public static final int x = new Random().nextInt(3); package com.zuoyan.classloader; import java.util.Random...1 Demo01 的执行结果是 3 ,没有输出静态代码块中的内容,就代表静态代码块没有被执行,也就是说类没有被初始化,如果类被初始化了,静态代码块是一定会执行的。     ...的常量池中,所以编译完后,MyTest01 和 FinalTest之间就没有任何关系了,删除FinalTest.class 没有任何关系 Demo02 的执行结果的原因是 : x 不是一个成员变量,需要加载类...,所需需要初始化类 Demo03 结果出现的原因是: x 是一个成员变量,但是他的数值实在运行期才能确定的,所以需要加载FinalTest类 Demo04:  代码如下,请判断代码的执行结果 package...Main 方法所在类,然后这类调用了 Child类的成员变量,导致了Child类的初始化,一个类的初始化首先会初始化他的父类,然后初始化他的子类   可用通过运行时 添加JVM参数来查看类的加载 ?

    33730

    Java类加载机制

    双亲委派 所谓的双亲委派,则是先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。...双亲委派 双亲委派机制的优势:采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader...其次是考虑到安全因素,java核心api中定义类型不会被随意替换。...假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的...java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。

    10610

    Java类加载机制

    1、描述类的加载过程及各个步骤的主要工作? 答: 类的加载过程可以大体分为三个大的阶段:加载、连接、初始化。其中,连接阶段又可以细分为:验证、准备、解析这三个阶段。...各个步骤的主要工作如下: 加载:一个规则,就是需要把.java文件如何变成.class文件。...这个规则就是在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区访问这些数据的访问入口。 验证:验证字节流是否符合Class文件格式的规范。...准备:给类变量分配内存,并且设置变量初始值。 解析:将常量池的符号引用替换为直接引用的过程 初始化:根据程序去初始化变量和其他资源。 ? 2、简述加载器的双亲委派原则及双亲委派的意义?...意义:双亲委派避免类的重复加载问题,以及避免Java核心的API被篡改,保证了代码安全。

    67131

    java的类加载

    类加载机制 JVM类加载机制分为五个部分: 加载,验证,准备,解析,初始化 加载 加载是类加载过程中的一个阶段,会在内存中生成一个代表这个类的java.lang.Class 对象,作为方法区这个类的各种数据的入口...初始化 初始化阶段是类加载的最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自定义类加载器之外,其他操作都有JVM主导 到了初始化阶段,才开始真正执行类中定义的java程序代码 初始化阶段是 执行类构造器...什么时候触发类加载 什么情况需要开始类加载过程的第一阶段(加载)呢? Java虚拟机规范中并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。...扩展类加载器(Extension ClassLoader) 负责加载 JAVA_HOME\lib\ext 目录中的,或通过 java.ext.dirs 系统变量指定路径中的类 库。...应用程序类加载器(Application ClassLoader) 负责加载用户路径(classpath)上的类库 双亲委派 JVM通过 双亲委派模型进行类的加载,我们也可以通过继承 java.lang.ClassLoader

    85520

    java类加载过程

    其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。...在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。...所有其他的类加载器:这些类加载器都由Java语言实现,独立于虚拟机之外,并且全部继承自抽象类java.lang.ClassLoader,这些类加载器需要由启动类加载器加载到内存中之后才能去加载其他的类。...前面说解析阶段可能开始于初始化之前,也可能在初始化之后开始,虚拟机会根据需要来判断,到底是在类被加载器加载时就对常量池中的符号引用进行解析(初始化之前),还是等到一个符号引用将要被使用前才去解析它(初始化之后...4、接口方法解析:与类方法解析步骤类似,知识接口不会有父类,因此,只递归向上搜索父接口就行了。 初始化 初始化是类加载过程的最后一步,到了此阶段,才真正开始执行类中定义的Java程序代码。

    1.1K21

    java 类的加载

    2.为静态[变量]赋值,访问静态变量 3.调用静态方法 4.使用反射方法创建某个类或接口的反射方法java.lang.Class 5.初始化某子类...6.通过java.exe调用类的方法时 类加载器 根类加载器 扩展类加载器 系统类加载 其他加载方式都是属于被动加载...,不会导致类的加载和初始化 例如: 构造类的数组 Simple[] simples = new Simple[10]; 新建了一个Simple数组,但是并不会导致Simple类的初始化,该操作只是在内存堆中开辟了一段连续地址空间...; } static int a = 10 在准备阶段不是10 ,而是初始化的值0,当然final static int b 则仍然是10,因为被final修饰的静态变量不会导致类的初始化 类初始化 类的初始化阶段所有的变量都会被赋予正确的值...java.lang 包加载 扩展类加载器 扩展类加载器的父类是根加载器,主要用于加载java_home 下的jre\lib\ext里面的类库,java实现,可以将自己实现的类打包放到下面加载.

    76010
    领券