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

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

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

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

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对象,作为方法区中数据的访问入口。

41820

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

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

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

2.1K30

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

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

41120

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应用所需资源,如配置文件、图像文件等。

36520

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 ; ---- 总结 借助下图理解加载过程 ;

47710

深入解析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内部的具体实现; 觉得文章不错的朋友可以转发此文关注小编

60030

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

96910

加载Java加载机制解析

本文选自《揭秘Java虚拟机:JVM设计原理与实现》 加载——镜像与静态字段 加载的最终结果便是在JVM的方法区创建一个与Java对等的instanceKlass实例对象,但是在JVM创建完instanceKlass...以上便是一个Java加载的核心流程。了解了加载的核心流程之后,也许聪明的你会忍不住想,Java加载到底何时才会被触发呢?...Java加载由JVM自动触发——JVM执行完自身的若干初始化逻辑之后,第一个加载的便是Java程序的主。总体上而言,Java加载的链路如下: ?...java.c::main()方法调用java.c::JavaMain()方法,java.c::JavaMain()方法主要执行JVM的初始化逻辑,初始化完毕之后,便会搜索Java程序的main()主函数所在的...(String)接口的入参,系统加载器据此加载目标Java

81810

Java 加载过程

以下哪项不属于java加载过程?...A.生成java.lang.Class对象 B.int类型对象成员变量赋予默认值 C.执行static块代码 D.方法解析 从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载...加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定...加载加载阶段(可以参考java.lang.ClassLoader的loadClass()方法),虚拟机需要完成以下3件事情: 通过一个的全限定名来获取定义此类的二进制字节流(并没有指明要从一个Class...初始化 初始化阶段是加载过程的最后一步,到了初始化阶段,才真正开始执行中定义的java程序代码。

64620

JAVA加载过程

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

56074

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

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参数来查看加载 ?

31530

Java加载机制

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

64331

java加载

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

82620
领券