在前面的文章中,有详细地介绍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静态代码块和静态成员赋值的代码,合并为一个特殊的方法
- 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
可以自己调整一下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."
":()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点进修”,我们会有更多、且及时的资料推送给您,欢迎多多交流!
评论记录:
回复评论: