使用javap工具查看生成的class文件信息
java源文件
public class Synchronized {
public static void main(String[] args) {
// TODO Auto-generated method stub
synchronized (Synchronized.class) {
}
m();
}
public static synchronized void m() {
}
}
使用 javap -v 加上class文件 查看class内容:
D:\workspace\study\java-concurrent-project\target\classes\com\java\thread>javap -v Synchronized.class
Classfile /D:/workspace/study/java-concurrent-project/target/classes/com/java/thread/Synchronized.class
Last modified 2020-4-21; size 584 bytes
MD5 checksum df90d02eba39e380325082bde8cd46d4
Compiled from "Synchronized.java"
public class com.java.thread.Synchronized
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #4.#23 // java/lang/Object."<init>":()V
#2 = Class #24 // com/java/thread/Synchronized
#3 = Methodref #2.#25 // com/java/thread/Synchronized.m:()V
#4 = Class #26 // java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Utf8 Code
#8 = Utf8 LineNumberTable
#9 = Utf8 LocalVariableTable
#10 = Utf8 this
#11 = Utf8 Lcom/java/thread/Synchronized;
#12 = Utf8 main
#13 = Utf8 ([Ljava/lang/String;)V
#14 = Utf8 args
#15 = Utf8 [Ljava/lang/String;
#16 = Utf8 StackMapTable
#17 = Class #15 // "[Ljava/lang/String;"
#18 = Class #26 // java/lang/Object
#19 = Class #27 // java/lang/Throwable
#20 = Utf8 m
#21 = Utf8 SourceFile
#22 = Utf8 Synchronized.java
#23 = NameAndType #5:#6 // "<init>":()V
#24 = Utf8 com/java/thread/Synchronized
#25 = NameAndType #20:#6 // m:()V
#26 = Utf8 java/lang/Object
#27 = Utf8 java/lang/Throwable
{
public com.java.thread.Synchronized();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/java/thread/Synchronized;
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=1
0: ldc #2 // class com/java/thread/Synchronized
2: dup
3: astore_1
4: monitorenter
5: aload_1
6: monitorexit
7: goto 15
10: astore_2
11: aload_1
12: monitorexit
13: aload_2
14: athrow
15: invokestatic #3 // Method m:()V
18: return
Exception table:
from to target type
5 7 10 any
10 13 10 any
LineNumberTable:
line 7: 0
line 9: 5
line 10: 15
line 11: 18
LocalVariableTable:
Start Length Slot Name Signature
0 19 0 args [Ljava/lang/String;
StackMapTable: number_of_entries = 2
frame_type = 255 /* full_frame */
offset_delta = 10
locals = [ class "[Ljava/lang/String;", class java/lang/Object ]
stack = [ class java/lang/Throwable ]
frame_type = 250 /* chop */
offset_delta = 4
public static synchronized void m();
descriptor: ()V
flags: ACC_PUBLIC, ACC_STATIC, ACC_SYNCHRONIZED
Code:
stack=0, locals=0, args_size=0
0: return
LineNumberTable:
line 15: 0
}
SourceFile: "Synchronized.java"
javap 命令的用法:
用法: javap <options> <classes>
其中, 可能的选项包括:
-help --help -? 输出此用法消息
-version 版本信息
-v -verbose 输出附加信息
-l 输出行号和本地变量表
-public 仅显示公共类和成员
-protected 显示受保护的/公共类和成员
-package 显示程序包/受保护的/公共类
和成员 (默认)
-p -private 显示所有类和成员
-c 对代码进行反汇编
-s 输出内部类型签名
-sysinfo 显示正在处理的类的
系统信息 (路径, 大小, 日期, MD5 散列)
-constants 显示最终常量
-classpath <path> 指定查找用户类文件的位置
-cp <path> 指定查找用户类文件的位置
-bootclasspath <path> 覆盖引导类文件的位置