Java中init和clinit方法是什么

Java中init和clinit是什么呢(准备的说这两个方法都应该加上<>,不过不知道为什么加上后一发表就显示为空了)?
在具体描述这两个方法之前,先来看看小伙伴们实际可能遇到这两个方法的场景:
先说下clinit方法,当我们DEBUG静态代码块时。比如下面一道题:
在这里插入图片描述
问会输出多少?具体输出多少小伙伴可以自行试验。我们关注的是当我们DEBUG到11行代码时,DEBUG窗口下会是这样:
在这里插入图片描述
标红的位置就是clinit方法。
我们也可以把代码稍作调整,在staic代码块中抛出一个运行时异常,看下异常信息的堆栈,截图如下:
在这里插入图片描述
从堆栈信息我们能更直观的看到这个clinit方法。
clinit方法是由编译器自动收集类中所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的。类加载的初始化阶段就是执行类构造器clinit方法的过程。关于类加载以及初始化阶段具体的信息我们不多说,如果我们想看到这个方法到底是什么,可以从字节码下手(很多时候从源码看不出来的问题看下字节码就很容易找出问题了),比如使用javap -v ClassInitTest.class拿到反汇编后字节码,其中的方法表(Class类文件结构中对方法的描述信息)部分截图如下:
在这里插入图片描述
那么怎么证明这确实是clinit方法呢?我们可以在idea中安装上jclasslib,安装方法为:
File>Settings>Plugins,搜索jclasslib,install安装后重启即可。重启后打开对应的java文件,选择View>Show Bytecode With Jclasslib打开,如下:
在这里插入图片描述
classlib中的Methods中第三个方法(下标为2)即为clinit方法,对应的字节码见上图最右边部分,有兴趣的小伙伴可以查下JVM指令,跟上图最左边部分java源码进行下对应。
未完待续(init方法是实例构造器,注意clinit是类构造器),init方法部分后续再补充。

发布了14 篇原创文章 · 获赞 3 · 访问量 931

猜你喜欢

转载自blog.csdn.net/sjz88888/article/details/104704452