深入学习Java,必须要了解Class文件的一些内部知识,今天学习一下javap工具。
通过javap查看命令。
E:\Java\jdk8study\target\classes>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> 覆盖引导类文件的位置
编写一段简单的Java代码
package classp;
public class JvmClassIns {
public static void main(String[] args) {
int x = 20;
int y = 8;
int z = x +y;
}
}
通过javap进行反汇编
E:\Java\jdk8study\target\classes>javap -c classp/JvmClassIns.class
Compiled from "JvmClassIns.java"
public class classp.JvmClassIns {
public classp.JvmClassIns();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 20
2: istore_1
3: bipush 8
5: istore_2
6: iload_1
7: iload_2
8: iadd
9: istore_3
10: return
}
涉及的概念:
- Java虚拟机栈,栈帧,字节码指令。
资料:
- 字节码指令含义:https://cloud.tencent.com/developer/article/1333540
- JAVA虚拟机结构之栈帧https://blog.csdn.net/u014296316/article/details/82668670
摘一些重要的知识
bipush:将单字节常量值推送至栈顶-127---128
istore_1:将栈顶int类型的数值存到第二个本地变量
-v参数
E:\Java\jdk8study\target\classes>javap -v classp/JvmClassIns.class
Classfile /E:/Java/jdk8study/target/classes/classp/JvmClassIns.class
Last modified 2020-7-16; size 458 bytes
MD5 checksum 790b362635bb39c7f64991c13a9e0802
Compiled from "JvmClassIns.java"
public class classp.JvmClassIns
minor version: 0
major version: 49
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #3.#21 // java/lang/Object."<init>":()V
#2 = Class #22 // classp/JvmClassIns
#3 = Class #23 // java/lang/Object
#4 = Utf8 <init>
#5 = Utf8 ()V
#6 = Utf8 Code
#7 = Utf8 LineNumberTable
#8 = Utf8 LocalVariableTable
#9 = Utf8 this
#10 = Utf8 Lclassp/JvmClassIns;
#11 = Utf8 main
#12 = Utf8 ([Ljava/lang/String;)V
#13 = Utf8 args
#14 = Utf8 [Ljava/lang/String;
#15 = Utf8 x
#16 = Utf8 I
#17 = Utf8 y
#18 = Utf8 z
#19 = Utf8 SourceFile
#20 = Utf8 JvmClassIns.java
#21 = NameAndType #4:#5 // "<init>":()V
#22 = Utf8 classp/JvmClassIns
#23 = Utf8 java/lang/Object
{
public classp.JvmClassIns();
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 Lclassp/JvmClassIns;
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=4, args_size=1
0: bipush 20
2: istore_1
3: bipush 8
5: istore_2
6: iload_1
7: iload_2
8: iadd
9: istore_3
10: return
LineNumberTable:
line 5: 0
line 6: 3
line 7: 6
line 9: 10
LocalVariableTable:
Start Length Slot Name Signature
0 11 0 args [Ljava/lang/String;
3 8 1 x I
6 5 2 y I
10 1 3 z I
}
SourceFile: "JvmClassIns.java"
JDK版本
E:\Java\jdk8study\target\classes>java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)