不可逆的类初始化过程

  • 不可逆的类初始化过程

    • 类的加载过程简单来说loaded->linked->initialized这么几个阶段
    • 类的初始化
      class BadClass{ private static int a=100; static{ System.out.println("before init"); int b=3/0; System.out.println("after init"); } public static void doSomething(){ System.out.println("do somthing"); } }
      public static void main(String args[]){ try{ BadClass.doSomething(); }catch (Throwable e){ e.printStackTrace(); } BadClass.doSomething(); }
      • 会打印多次before init吗?
      • 只输出了一次before init,这是为什么呢?
      • jvm规范规定有且只有5中主动使用的情况下必须立即初始化类
        • new getstatic putstatic invokestatic
        • java.lang.reflect的方法对类进行反射时
        • 初始一个类时父类没有初始化时
        • main()方法的类
        • JDK7的动态语言支持....
      • 但是这个过程是不可逆的,也就是说当我们执行一遍之后再也不会执行了,如果在执行这个方法过程中出现了异常没有被捕获,那这个类将永远不可用,虽然我们上面执行BadClass.doSomething()的时候catch住了异常,但是当代码跑到这里的时候,在jvm里已经将这个类打上标记了,说这个类初始化失败了,下次再初始化的时候就会直接返回并抛出类似的异常java.lang.NoClassDefFoundError: Could not initialize class BadClass,而不去再次执行初始化的逻辑
        enum ClassState { unparsable_by_gc = 0, // object is not yet parsable by gc. Value of _init_state at object allocation. allocated, // allocated (but not yet linked) loaded, // loaded and inserted in class hierarchy (but not linked yet) linked, // successfully linked/verified (but not initialized yet) being_initialized, // currently running class initializer fully_initialized, // initialized (successfull final state) initialization_error // error happened during initialization };
      • 如果clinit执行失败了,抛了一个未被捕获的异常,那将这个类的状态设置为initialization_error,并且无法再恢复,因为jvm会认为你这次初始化失败了,下次肯定也是失败的,为了防止不断抛这种异常,所以做了一个缓存处理,不是每次都再去执行clinit,因此大家要特别注意,类的初始化过程可千万不能出错,出错就可能只能重启了哦。
  • References

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官方文档 初始化 Initialization是为准备使用类,结构体或者枚举实例的一个过程。这个过程涉及了在实例里...
    hrscy阅读 4,804评论 0 1
  • 123.继承 一个类可以从另外一个类继承方法,属性和其他特征。当一个类继承另外一个类时, 继承类叫子类, 被继承的...
    无沣阅读 5,262评论 2 4
  • 北冥有鱼,可化鲲:鲲可遨五洋,可化鹏,鹏能渡万里,鲲鹏可入九天。有诗曰:大鹏一日随风起扶摇直上九万里! 每...
    洒脱客阅读 4,216评论 1 1
  • 导语:有人说“魔鬼在细节里”,我想说“效果都在具体中”。我的原则一和原则二的核心就是“具体!具体!再具体!”。 最...
    JeffreyShu阅读 3,207评论 0 0
  • 暑假的时候去了趟贵州,三国时期的蜀地,当然肯定去了世界上最大瀑布群--黄果树瀑布,然后在我的朋友那儿住了将近一个...
    WS小冰歌阅读 2,629评论 0 5