[Java SE] Java静态代码块与静态属性的执行顺序

目录

  • 最近有个需求,需要对日志框架进行动态注入一些配置。
  • 这就涉及到了Java普通应用程序的启动顺序/生命周期。

Java普通应用程序,可以理解为 未接入spring框架的Java应用。

  • 这不,就盯上了 通过 静态代码块来注入,需要在 静态属性' private final static Logger logger= LoggerFactory.getLogger(xxx.class)'之前执行。

  • 这个试验是成功了。
    (但最终没有采用这种方式,因static方案无法满足我从外部动态加载某些配置参数进来)

重要结论

先说结论,再去观察实验现象,印证结论。

  • 静态变量初始化和静态代码块的执行顺序是:按照它们在类中出现的顺序进行的

  • static 块的执行时机

类被加载了不一定就会执行静态代码块,只有一个类被主动使用时静态代码才会被执行!
当一个类被主动使用时,Java虚拟就会对其初始化,如下六种情况为主动使用:

  • 当创建某个类的新实例时(如通过new或者反射,克隆,反序列化等)
  • 当调用某个类的静态方法时
  • 当使用某个类或接口的静态字段时
  • 当调用Java API中的某些反射方法时,比如类Class中的方法,或者java.lang.reflect中的类的方法时
  • 当初始化某个子类时
  • 当虚拟机启动某个被标明为启动类的类(即包含main方法的那个类)

代码实验

实验1


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JavaStaticTest {
    private final static String VAR = "xx";//0

    static {
        System.out.println("world!");//1
    }

    private final static Logger logger = getLogger();//2

    public static void main(String[] args) {
        System.out.println("hello");//4
    }

    public static Logger getLogger(){
        System.out.println("Hahaha");//3
        return LoggerFactory.getLogger(JavaStaticTest.class);
    }
}

实验2

public class StaticOrder {
    static {
        System.out.println("Static Block 1");//1.1
    }

    static int a = initializeA();//2.1

    static {
        System.out.println("Static Block 2");//3
    }

    static int b = initializeB();

    static int initializeA() {
        System.out.println("Initializing A");//2.2
        return 10;
    }

    static int initializeB() {
        System.out.println("Initializing B");//4
        return 20;
    }

    public static void main(String[] args) {
        System.out.println("Main Method");//5
    }
}

out

Static Block 1
Initializing A
Static Block 2
Initializing B
Main Method

X 参考文献

posted @   千千寰宇  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
点击右上角即可分享
微信分享提示