java static 块 时机_java的static块执行时机
之前一直认为static块是在class load的时候执行,今天在验证Spring初始化Context loader的时候,发现bean的static块并没有执行。
Class A{
static{
System.out.println("static block invoked!")
}
}
那么static块到底在什么时候运行的呢?如果了解JVM原理,我们知道,一个类的运行分为以下步骤:
装载
连接
初始化
其中装载阶段又三个基本动作组成:
通过类型的完全限定名,产生一个代表该类型的二进制数据流
解析这个二进制数据流为方法区内的内部数据结构
创建一个表示该类型的java.lang.Class类的实例
另外如果一个类装载器在预先装载的时遇到缺失或错误的class文件,它需要等到程序首次主动使用该类时才报告错误。
连接阶段又分为三部分:
验证,确认类型符合Java语言的语义,检查各个类之间的二进制兼容性(比如final的类不用拥有子类等),另外还需要进行符号引用的验证。
准备,Java虚拟机为类变量分配内存,设置默认初始值。
解析(可选的) ,在类型的常量池中寻找类,接口,字段和方法的符号引用,把这些符号引用替换成直接引用的过程。
当一个类被主动使用时,Java虚拟就会对其初始化,如下六种情况为主动使用:
当创建某个类的新实例时(如通过new或者反射,克隆,反序列化等)
当调用某个类的静态方法时
当使用某个类或接口的静态字段时
当调用Java API中的某些反射方法时,比如类Class中的方法,或者java.lang.reflect中的类的方法时
当初始化某个子类时
当虚拟机启动某个被标明为启动类的类(即包含main方法的那个类)
Java编译器会收集所有的类变量初始化语句和类型的静态初始化器,将这些放到一个特殊的方法中:clinit。
实际上,static块的执行发生在“初始化”的阶段。初始化阶段,jvm主要完成对静态变量的初始化,静态块执行等工作。
下面我们看看执行static块的几种情况:
1、第一次new A()的过程会打印"";因为这个过程包括了初始化
2、第一次Class.forName("A")的过程会打印"";因为这个过程相当于Class.forName("A",true,this.getClass().getClassLoader());
3、第一次Class.forName("A",false,this.getClass().getClassLoader())的过程则不会打印""。因为false指明了装载类的过程中,不进行初始化。不初始化则不会执行static块。
参考资料:深入Java虚拟机
java static 块 时机_java的static块执行时机相关推荐
- java 同步块原理_Java同步代码块和同步方法原理与应用案例详解
Java同步代码块和同步方法原理与应用案例详解 发布于 2020-8-7| 复制链接 摘记: 本文实例讲述了Java同步代码块和同步方法.分享给大家供大家参考,具体如下:一 点睛所谓原子性:一段代码要 ...
- java类静态初始化_Java静态代码块和类初始化、实例初始化过程
1. 静态代码块 静态代码块:定义在类中方法外,使用static修饰 ①可以为类变量(静态变量)初始化 ②静态代码块在第一次使用这个类之前执行,即在类初始化时执行,且只执行一次 ③若有多个静态代码块, ...
- java中static什么意思_java中static什么意思
java中,static表示"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,或者进行静态导包.static的特点:1.随着类的加载而被加载:2.优先于 ...
- java static final关键字_Java的static与final关键字
版权声明:转载原创文章请以超链接形式请注明原文章出处,尊重作者,尊重原创! 恰饭广告 static:(静态修饰符)面向对象中static修饰的内容是隶属于类,而不是直接隶属于对象的,所以static修 ...
- java静态变量特点_Java中static的特点
前两天面试时被问到静态的特点,当时回答地不是很好,现在来总结一下 在了解某样东西的时候我们通常会从它是什么,为什么,和怎么样在三方面来衡量,对于java中的static,我们也这样讨论下,要明确以下几 ...
- cal java中的用法_Java中static用法
Java中static用法 转自 http://blog.pfan.cn/sword2008/13772.html 一.static 请先看下面这段程序: public class Hello{ pu ...
- java cmd停服务_java代码启动cmd执行命令来开启服务出现无法连接的问题
我想使用openoffice的格式转换功能,需要先开启openoffice的服务,当我手动敲入命令的时候,是可以运行起来的,但是通过Java代码执行却出现拒绝连接的问题,请帮我看看怎么回事 publi ...
- java 多线程 变慢_java多线程并发程序执行慢有什么原因?该怎么解决?
我们在执行java多线程并发程序时有时候会碰到执行特别慢的场景,小伙伴们知道是什么原因导致的吗?它要怎么解决呢?下面小编就为你讲讲. 前提:在某地需要开发一个应用系统,此系统主要功能是能够让一些中小型 ...
- java同步方法完成案例_Java同步代码块和同步方法原理与应用案例详解
本文实例讲述了java同步代码块和同步方法.分享给大家供大家参考,具体如下: 一 点睛 所谓原子性WOmoad:一段代码要么执行,要么不执行,不存在执行一部分被中断的情况.言外之意是这段代码就像原子一 ...
最新文章
- 1013 Battle Over Cities(并查集解法)
- 包装又缩水!iPhone 13包装盒塑料膜变纸质拉条 网友:要将环保进行到底?
- C++学习笔记-异常处理
- tcp/ip ---IP路由选择
- flume学习(六):如何使用event header中的key值
- web项目设计文档_web项目前后端分离模式下的权限设计方案
- java基础学习(6)疯狂java讲义第5章课后习题解答源码
- ubuntu18安装wine QQ——2021.11.9
- ARM交叉编译工具链安装和使用教程【图文并茂】
- 矩阵的转置例题MATLAB,MATLAB特殊矩阵以及矩阵转置
- world Best 500 interview exam
- 爬虫(29)mongodb(下)
- 这些重构小技巧,给你项目瘦瘦身吧!
- 第11章 Linux的网络管理
- 9大常见光固化3D打印树脂分析
- QtCreator生成标准多行函数或者类详细注释
- IDEA取消重复代码提示功能
- 对着网页进行右键操作------审查元素(快速查看标签代码)
- 【实用代码】选项卡切换——带标题底纹样式
- poi ppt 作者属性 修改_ppt文字属性-如何让PowerPoint里作者等信息不被修改自己辛辛苦苦做的工 爱问知识人...