Java中init和clinit方法是什么

本文详细解析了Java中clinit方法的含义及其作用。clinit方法由编译器自动生成,用于执行类变量的赋值操作和静态代码块中的语句。通过调试和字节码分析,展示了clinit方法在类加载过程中的执行情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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方法部分后续再补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值