之前一直认为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块执行时机相关推荐

  1. java 同步块原理_Java同步代码块和同步方法原理与应用案例详解

    Java同步代码块和同步方法原理与应用案例详解 发布于 2020-8-7| 复制链接 摘记: 本文实例讲述了Java同步代码块和同步方法.分享给大家供大家参考,具体如下:一 点睛所谓原子性:一段代码要 ...

  2. java类静态初始化_Java静态代码块和类初始化、实例初始化过程

    1. 静态代码块 静态代码块:定义在类中方法外,使用static修饰 ①可以为类变量(静态变量)初始化 ②静态代码块在第一次使用这个类之前执行,即在类初始化时执行,且只执行一次 ③若有多个静态代码块, ...

  3. java中static什么意思_java中static什么意思

    java中,static表示"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,或者进行静态导包.static的特点:1.随着类的加载而被加载:2.优先于 ...

  4. java static final关键字_Java的static与final关键字

    版权声明:转载原创文章请以超链接形式请注明原文章出处,尊重作者,尊重原创! 恰饭广告 static:(静态修饰符)面向对象中static修饰的内容是隶属于类,而不是直接隶属于对象的,所以static修 ...

  5. java静态变量特点_Java中static的特点

    前两天面试时被问到静态的特点,当时回答地不是很好,现在来总结一下 在了解某样东西的时候我们通常会从它是什么,为什么,和怎么样在三方面来衡量,对于java中的static,我们也这样讨论下,要明确以下几 ...

  6. cal java中的用法_Java中static用法

    Java中static用法 转自 http://blog.pfan.cn/sword2008/13772.html 一.static 请先看下面这段程序: public class Hello{ pu ...

  7. java cmd停服务_java代码启动cmd执行命令来开启服务出现无法连接的问题

    我想使用openoffice的格式转换功能,需要先开启openoffice的服务,当我手动敲入命令的时候,是可以运行起来的,但是通过Java代码执行却出现拒绝连接的问题,请帮我看看怎么回事 publi ...

  8. java 多线程 变慢_java多线程并发程序执行慢有什么原因?该怎么解决?

    我们在执行java多线程并发程序时有时候会碰到执行特别慢的场景,小伙伴们知道是什么原因导致的吗?它要怎么解决呢?下面小编就为你讲讲. 前提:在某地需要开发一个应用系统,此系统主要功能是能够让一些中小型 ...

  9. java同步方法完成案例_Java同步代码块和同步方法原理与应用案例详解

    本文实例讲述了java同步代码块和同步方法.分享给大家供大家参考,具体如下: 一 点睛 所谓原子性WOmoad:一段代码要么执行,要么不执行,不存在执行一部分被中断的情况.言外之意是这段代码就像原子一 ...

最新文章

  1. 1013 Battle Over Cities(并查集解法)
  2. 包装又缩水!iPhone 13包装盒塑料膜变纸质拉条 网友:要将环保进行到底?
  3. C++学习笔记-异常处理
  4. tcp/ip ---IP路由选择
  5. flume学习(六):如何使用event header中的key值
  6. web项目设计文档_web项目前后端分离模式下的权限设计方案
  7. java基础学习(6)疯狂java讲义第5章课后习题解答源码
  8. ubuntu18安装wine QQ——2021.11.9
  9. ARM交叉编译工具链安装和使用教程【图文并茂】
  10. 矩阵的转置例题MATLAB,MATLAB特殊矩阵以及矩阵转置
  11. world Best 500 interview exam
  12. 爬虫(29)mongodb(下)
  13. 这些重构小技巧,给你项目瘦瘦身吧!
  14. 第11章 Linux的网络管理
  15. 9大常见光固化3D打印树脂分析
  16. QtCreator生成标准多行函数或者类详细注释
  17. IDEA取消重复代码提示功能
  18. 对着网页进行右键操作------审查元素(快速查看标签代码)
  19. 【实用代码】选项卡切换——带标题底纹样式
  20. poi ppt 作者属性 修改_ppt文字属性-如何让PowerPoint里作者等信息不被修改自己辛辛苦苦做的工 爱问知识人...

热门文章

  1. 这50个思维方法,深刻改变了我的人生
  2. 23种设计模式之迭代器模式
  3. 二叉树学习之二叉查找树
  4. 科学地花钱:基于端智能的在线红包分配方案
  5. 利用对象存储多种方式 保障OSS数据安全
  6. 阿里巴巴叔同谈云原生和云计算
  7. 刚刚,阿里开源 iOS 协程开发框架 coobjc!
  8. 2019阿里云开年Hi购季满返活动火热报名中!
  9. 看完这些干货帖,大数据产品从入门到精通
  10. 基于阿里云Serverless架构下函数计算的最新应用场景详解(二)