本文共 1667 字,大约阅读时间需要 5 分钟。
java为我们提供了javap命令来查看class字节码,下面以实例来进行说明。首先写一段单例懒加载的代码:
class Singleton{
private volatile static Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if(instance==null) {
synchronized (Singleton.class) {
if(instance==null)
instance = new Singleton();
}
}
return instance;
}
}
对上面代码进行编译,操作,这里采用idea的maven环境进行编译,编译之后,class文件位于target目录下。
然后通过idea提供的Terminal工具,进入该目录:
ershixiongdeMacBook-Pro:java-stream zzs$ cd target/classes/com/secbro2/singleton/
ershixiongdeMacBook-Pro:singleton zzs$ ls
Singleton.class
ershixiongdeMacBook-Pro:singleton zzs$
然后执行以下命令,并获得字节码内容:
javap -c Singleton.class
Compiled from "Singleton.java"
public class com.secbro2.singleton.Singleton {
public static com.secbro2.singleton.Singleton getInstance();
Code:
0: getstatic #2 // Field instance:Lcom/secbro2/singleton/Singleton;
3: ifnonnull 37
6: ldc #3 // class com/secbro2/singleton/Singleton
8: dup
9: astore_0
10: monitorenter
11: getstatic #2 // Field instance:Lcom/secbro2/singleton/Singleton;
14: ifnonnull 27
17: new #3 // class com/secbro2/singleton/Singleton
20: dup
21: invokespecial #4 // Method "":()V
24: putstatic #2 // Field instance:Lcom/secbro2/singleton/Singleton;
27: aload_0
28: monitorexit
29: goto 37
32: astore_1
33: aload_0
34: monitorexit
35: aload_1
36: athrow
37: getstatic #2 // Field instance:Lcom/secbro2/singleton/Singleton;
40: areturn
Exception table:
from to target type
11 29 32 any
32 35 32 any
static {};
Code:
0: aconst_null
1: putstatic #2 // Field instance:Lcom/secbro2/singleton/Singleton;
4: return
}
查看字节码对于java内部执行的逻辑可以有很好的理解,特别是对于线程并发相关方面的有非常大的帮助。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接