深究一个静态代码块不被执行问题

深究一个静态代码块不被执行问题

问题现象:

  1. spring环境中的bean 的静态代码块会被自动执行
  2. 工具类中的静态代码块不被自动执行,工具类第一次被调用时静态代码块执行
  3. 通过子类调用继承的父类的方法,子类静态代码块不被执行

复习ClassLoad

Java类加载 会初始化的情况有且仅有以下五种:(也称为主动引用)

1.遇到new(用new实例对象),getStatic(读取一个静态字段),putstatic(设置一个静态字段),invokeStatic(调用一个类的静态方法)这四条指令字节码命令时

2.使用Java.lang.reflect包的方法对类进行反射调用时,如果此时类没有进行init,会先init。

3.当初始化一个类时,如果其父类没有进行初始化,先初始化父类

4.jvm启动时,用户需要指定一个执行的主类(包含main的类)虚拟机会先执行这个类

5.当使用JDK1.7的动态语言支持的时候,当java.lang.invoke.MethodHandler实例后的结果是REF-getStatic/REF_putstatic/REF_invokeStatic的句柄,并且这些句柄对应的类没初始化的话应该首先初始

问题分析

  1. 工具类中的静态代码块不被自动执行

    项目启动时工具类不满足Java类加载条件,因此未初始化,在第一次调用时,满足Java类加载条件,ClassLoad同时执行静态代码块

  2. 通过子类调用继承的父类的方法,子类静态代码块不被执行

    对应于Java类加载 第一条,invokeStatic的对象是父类,虽然是子类引用了父类方法,但是代码的归属权上归属于父类,因此子类静态代码块不执行(拓展子类引用父类静态变量同理)

  3. 拓展问是不是在项目启动时类一定会被加载到内存

    答案时否定的,使用时才会加载。因此对性能要求较高情况需考虑启动时全量加载。

你可能感兴趣的:(问题记录,JAVA基础)