Geo*_*rge 10 java jvm bytecode
我知道新的,dup,invokespecial和astore字节码模式将调用实例初始化方法,<init>当有人从Java语言的角度来看Java类时,但是我从来没有弄清楚谁调用了特殊<clinit>方法,这是什么时候发生的?
我的猜测是在方法之前<clinit>调用.任何机构都可以给我一些信息来证明吗?这是在JVM规范还是Java语言规范中记录的? <init>
<clinit>是javac添加的静态方法,在类加载后由JVM调用.我们可以使用字节码大纲工具在类字节码中看到这个方法.请注意,<clinit>仅在类需要静态初始化时添加,例如
public class Test1 {
static int x = 1;
public static void main(String[] args) throws Exception {
}
}
public class Test2 {
static final int x = 1;
public static void main(String[] args) throws Exception {
}
}
Run Code Online (Sandbox Code Playgroud)
Test1 <clinit>因为其字段x需要用1初始化; 而Test2没有<clinit>方法,因为它x是一个常数.
值得注意的是,Class.forName有一个boolen intializeparam可以确定是否应该在加载后初始化类.
| 归档时间: |
|
| 查看次数: |
6693 次 |
| 最近记录: |