在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下。
下面我们将以字节码的视角来分析构造方法
CInit
// 从字节码角度来分析:构造方法
public class T09_ByteAnalyseCInit {
static int i = 10;
static {
i = 20;
}
static {
i = 30;
}
}
T09_ByteAnalyseCInit 字节码:使用javap -v T09_ByteAnalyseCInit.class,将java程序对应的字节码如下,并做了执行的注释。
编译器会按从上至下的顺序,收集所有static静态代码块和静态成员赋值的代码,合并为一个特殊的方法<cinit>()V:
0: bipush 10 // 将一个byte型常量值推送至栈顶
2: putstatic #2 // Field i:I // 为指定的类的静态域赋值
5: bipush 20 // 将一个byte型常量值推送至栈顶
7: putstatic #2 // Field i:I // 为指定的类的静态域赋值
10: bipush 30 // 将一个byte型常量值推送至栈顶
12: putstatic #2 // Field i:I // 为指定的类的静态域赋值
15: return // 当前方法返回void
<cinit>()V: 方法会在类加载的初始化阶段被调用
可以自己调整一下static变量和静态代码块的位置,观察字节码的改动
Init
// 从字节码角度来分析:构造方法
public class T10_ByteAnalyseInit {
private String a = "s1";
{
b = 20;
}
private int b = 10;
{
a = "s2";
}
public T10_ByteAnalyseInit(String a, int b) {
this.a = a;
this.b = b;
}
public static void main(String[] args) {
T10_ByteAnalyseInit d = new T10_ByteAnalyseInit("s3", 30);
System.out.println(d.a);
System.out.println(d.b);
}
}
T10_ByteAnalyseInit 字节码:使用javap -v T10_ByteAnalyseInit.class,将java程序对应的字节码如下,并做了执行的注释。
编译器会按从上至下的顺序,收集所有{ } 代码块和成员变量赋值的代码,形成新的构造方法,但原始构造方法内的代码总是在最后
public com.jvm.t07_bytecode.T10_ByteAnalyseInit(java.lang.String, int);
descriptor: (Ljava/lang/String;I)V
flags: ACC_PUBLIC
Code:
stack=2, locals=3, args_size=3
0: aload_0
1: invokespecial #1 // super."<init>":()V
4: aload_0
5: ldc #2 // <- "s1"
7: putfield #3 // -> this.a
10: aload_0
11: bipush 20 // <- 20
13: putfield #4 // -> this.b
16: aload_0
17: bipush 10 // <- 10
19: putfield #4 // -> this.b
22: aload_0
23: ldc #5 // <- "s2"
25: putfield #3 // -> this.a
28: aload_0 // -----------------------------------构造方法
29: aload_1 // <- slot 1(a) "s3" |
30: putfield #3 // -> this.a |
33: aload_0 |
34: iload_2 // <- slot 2(b) 30 |
35: putfield #4 // -> this.a ------------------------
38: return
LineNumberTable:......
LocalVariableTable:
Start Length Slot Name Signature
0 39 0 this Lcom/jvm/t07_bytecode/T10_ByteAnalyseInit;
0 39 1 a Ljava/lang/String;
0 39 2 b I
文章最后,给大家推荐一些受欢迎的技术博客链接:
- Hadoop相关技术博客链接
- Spark 核心技术链接
- JAVA相关的深度技术博客链接
- 超全干货--Flink思维导图,花了3周左右编写、校对
- 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
- 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
- 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂
欢迎扫描下方的二维码或 搜索 公众号“10点进修”,我们会有更多、且及时的资料推送给您,欢迎多多交流!